后缀数组求字符串最长重复子串
2014-04-24 15:06
225 查看
求一个字符串的最长重复子串:
1.求字符串s的后缀数组suffix
2.suffix排序
3.求最长公共前缀
1.求字符串s的后缀数组suffix
2.suffix排序
3.求最长公共前缀
#include<iostream> #include<fstream> #include<string> #include<vector> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<unordered_map> #include<unordered_set> #include<algorithm> using namespace std; int comlen(string s1,string s2) { //计算两个字符串的最长公共前缀 int i=0,j=0; int len=0; while(i<s1.size()&&j<s2.size()) { if(s1[i]==s2[i]) { i++;j++; len++; } else return len; } return len; } string FindRepeatSubstr(string s) { vector<string> suffix; //后缀数组 string ans; int len=0; int maxlen=0; int i; for(i=0;i<s.size();i++) { suffix.push_back(s.substr(i,s.size()-i)); } sort(suffix.begin(),suffix.end()); //给后缀数组排序 for(i=0;i<suffix.size()-1;i++) //计算相邻两个后缀数组的最长公共前缀 { len=comlen(suffix[i],suffix[i+1]); if(len>maxlen) { maxlen=len; ans=suffix[i].substr(0,maxlen); } } return ans; } int main() { string str; while(cin>>str) { if(str=="") cout<<""<<endl; cout<<FindRepeatSubstr(str)<<endl; } return 0; }
相关文章推荐
- 【编程珠玑】第十五章--字符串:用后缀数组查找最长不重叠的重复子串
- 利用后缀数组求字符串的最长重复子串的算法 利用二维数组求两个字符串的最长公共字串(动态规划)
- 字符串 后缀数组(可重叠的k 次最长重复子串)poj 3261
- poj 1743 字符串 后缀数组 不可重叠最长重复子串
- 后缀数组求解字符串的最长重复子串
- 使用后缀数组求字符串的最长重复子串
- 后缀数组--(可重叠最长重复子串问题)
- POJ 3261 Milk Patterns (后缀数组,求可重叠的k次最长重复子串)
- 【后缀数组求可重叠的k 次最长重复子串】POJ 3261
- 【后缀数组】不可重叠最长重复子串
- 后缀数组求最长重复子串(可重叠的)
- Hiho 122 后缀数组三·重复旋律3(多个串的最长公共重复子串)
- 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- POJ 1743 Musical Theme 后缀数组 最长重复不相交子串
- poj 3261 后缀数组 Or KMP 可重叠的 k 次最长重复子串
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 【啊哈,算法】之十、后缀数组,求最长重复子串
- POJ 3294 Life Forms (后缀数组,求出现在不少于k个字符串的最长子串)
- 用后缀数组 求一个字符串的最长重复字串
- 【后缀数组】不可重叠最长重复子串