字符串中连续出现最多的子串 & 字符串中最长反复子串

字符串中连续出现最多的子串 & 字符串中最长反复子串,这两个问题都能够用后缀数组来表示,至于后缀数组能够參考编程珠玑P156;后缀数组就是定义一个数组指针,分别指向字符串中的相应位置,例如以下:

a b c a b c a b c d e .substr[0]

b c a b c a b c d e ....substr[1]

c a b c a b c d e .......substr[2]

a b c a b c d e ..........substr[3]

b c a b c d e .............substr[4]

c a b c d e ...............substr[5]

a b c d e .................substr[6]

b c d e ...................substr[7]

c d e .....................substr[8]

d e ........................substr[9]

e ..........................substr[10]

上面的 substr 就是abcabcabcde的后缀数组;

一、字符串中连续出现最多的子串

针对这个问题能够使用后缀数组的思想,能够看到,子串连续出现,则满足 substr[0].substr(i, j - i) = substr[j].substr(0, j - i)。知道了这一点程序就好编写了,下面是C++代码:
<span style="font-size:18px;">string MaxTimesOfContinue(string str)
{int len = str.length();int maxCount = 0;string longest = "";for (int i = 0; i < len; ++i){for (int j = i + 1; j < len; ++j){if (str.substr(i, j - i) == str.substr(j, j - i)){int offset = j - i;int count = 2;for (int k = j + offset; j <= len; k += offset){if (str.substr(i, offset) == str.substr(k, offset))++count;elsebreak;}if (count > maxCount){maxCount = count;longest = str.substr(i, offset);}}}}return longest;
}</span>

二、字符串中最长反复子串

这个问题相同能够用后缀数组的思想来做,当然開始肯定想到的是暴力法,即求全部反复子串的长度,之后选择一个最长的就可以。

int Comlen(char *str1, char *str2)
{int i = 0;while(*str2 && (*str1++ == *str2++))++i;return i;
}int MaxLength(char *str)
{if(str == NULL)return 0;int maxLen = 0;int n = strlen(str);int maxi, maxj;for (int i = 0; i < n; ++i){for(int j = i + 1; j < n; ++j){int thisLen = 0;if ((thisLen = Comlen(&str[i], &str[j])) > maxLen){maxLen = thisLen;maxi = i;maxj = j;}}}return maxLen;
}

若是使用后缀数组的方法能够:
对于字符串 banana,其后缀数组为
a[0]:banana
a[1]:anana
a[2]:nana
a[3]:ana
a[4]:na
a[5]:a

将后缀数组按字典排序

a[0]:a
a[1]:ana
a[2]:anana
a[3]:banana 
a[4]:na
a[5]:nana

之后比較相邻两个子串就可以:

int Comlen(char *str1, char *str2)
{int i = 0;while(*str2 && (*str1++ == *str2++))++i;return i;
}
int Pstrcmp(const void *a, const void *b)
{return  strcmp(*(char**)a, *(char**)b);
}
//char *a[11];
int MaxLength(char *str)
{if(str == NULL)return 0;int maxLen = 0;int len = strlen(str);char **a = new char *[len + 1];for (int i = 0; i < len ; ++i)a[i] = &str[i];qsort(a, len , sizeof(char *), Pstrcmp);for (int i = 0; i < len - 1; ++i)if(Comlen(a[i], a[i+1]) > maxLen)maxLen = Comlen(a[i], a[i+1]);return maxLen;
}

字符串中连续出现最多的子串 amp; 字符串中最长反复子串相关推荐

  1. 找出一个字符串中出现次数最多的字_海量数据中找出前k大数(topk问题)

    在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题. 针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到 ...

  2. php 最长公共子串,PHP实现求解最长公共子串思路方法

    本文实例讲述了PHP实现求解最长公共子串问题的方法.分享给大家供大家参考,具体如下: 题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串. 注意, ...

  3. python求字符串中出现的第一个最长重复子串(如banana中最长重复子串为ana)

    #字符串中出现的第一个最长重复子串 class commonsubstring():def maxlen(self,s1,s2): #最长公共子串的长度for i in range(min(len(s ...

  4. 求最长公共子序列python_用Python计算最长公共子序列和最长公共子串

    1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...

  5. 最长公共子串LCS (Longest Common Subsequence) 算法

    三个方法都有所借鉴,但代码部分是自己试着写出来的,虽然最后的运行结果都是正确的,但此过程中难免会有考虑不周全的地方,如发现代码某些地方有误,欢迎指正.同时有新的想法,也可以提出! 采用顺序结构存储串, ...

  6. 常考数据结构与算法:最长公共子串

    题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...

  7. 后缀数组求最长重复子串

    问题描述 给定一个字符串,求出其最长重复子串 例如:abcdabcd 最长重复子串是 abcd,最长重复子串可以重叠 例如:abcdabcda,这时最长重复子串是 abcda,中间的 a 是被重叠的. ...

  8. 动态规划—最长公共子串

    1.求最长公共子串的长度 问题描述:有两个字符串str和str2,求出两个字符串中最长公共子串长度.str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最 ...

  9. 最长字符子串c语言,c语言:最长对称子串(3种解决方案)

    问题描述: 输入一个字符串,输出该字符串中最大对称子串的长度.例如输入字符串:"avvbeeb",该字符串中最长的子字符串是"beeb",长度为4,因而输出为4 ...

最新文章

  1. 美式期权定价python_【优质好课】Python量化期权实战应用
  2. C++析构函数不能失败的4个理由
  3. 无需激活直接同步登入discuz,php代码(直接可用)
  4. 基于ArcGIS API for JavaScript加载天地图
  5. Python基础语法学习(字符串)
  6. linux主要系统服务介绍
  7. 输出该数二进制表示中1的个数。求取十进制数字元素1的个数 (3种方法)
  8. postman电脑版无法安装_CPU使用率高达100%?试试安装Win10 2004版,旧电脑也能运行如飞...
  9. 安卓发布应用、更新的细节
  10. 将文件放到Android模拟器的SD卡
  11. 基础学习总结(一)--工程结构与打包过程
  12. 【转】POJ分类很好很有层次感
  13. 微信小程序报错:invalid credential, access_token is invalid or not latest
  14. ubuntu启动virtualbox出错解决办法:RTR3InitEx failed with rc=-1912 (rc=-1912)
  15. 注解 @EnableFeignClients 与 @ComponentScan 有冲突
  16. win10远程桌面查看对方计算机名,详细教你win10远程桌面连接命令
  17. 自动驾驶基础——惯性测量单元(IMU)
  18. CentOS7修改ip的两种方法
  19. Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)
  20. matlab输出多个参数到表格固定列,matlab将excle的列提取出来?如何使用Matlab提取Excel中指定列的数据?...

热门文章

  1. 在Gridview控件中根据Field Name来取得对应列索引
  2. CISCO与华为3COM路由器配置差别
  3. mysql服务怎么改名字_MySQL数据库改名字
  4. python的mysql模块_python使用MySQLdb模块连接MySQL
  5. python常用知识点_Python常用知识点
  6. jmeter插件 --PerfMon Metrics Collector监控工具的使用
  7. Java 9 揭秘(14. HTTP/2 Client API)
  8. CentOS 安装与优化
  9. 第二次作业— —结对项目
  10. eclipse怎么设置字体大小非原创