您的位置:首页 > 其它

求给定字符串中最长重复子串

2013-09-19 00:21 381 查看
问题描述:

给定一个字符串,如abcdaaabbbaaaabcdbbb,这个串中最长重复子串为abcd;若有多个长度相等的重复子串,只需输入第一个最长的。

最直观的算法设计:

设给定的字符串为s=“a1a2a3...an”,则对任意ai,在i+1到n之间查找aj, s.t. ai=aj,用idx记下此时ai下标,即i;然后依次比较ai+1,ai+2...与aj+1, aj+2是否相同,并记下最长相等的串的长度len,若此长度大于历史最大长度,则用idx及len更新历史最优值。重复此过程,直至i>=s.length()。算法复杂度为O(n^2),应该还有改进空间吧,大家可以写下自己的思路,一起讨论。

基于以上算法,可以很容易写出C++版代码:

#include <iostream>
#include <cstring>

using namespace std;

void printMaxDuplication(const char* src){
if(!src){
return;
}
int len = strlen(src);
//记录最长重复子串的起始位置以及对应最长的长度
int idx=0, maxLen=0;
for(int i =0; i < len; ++i){
for(int j = i+1, tempLen=0; j < len; ){
if(src[i] == src[j]){
//依次比较ai+1与aj+1。ai+2与aj+2
for(; src[j+tempLen] !='\0' && src[i+tempLen]==src[j+tempLen]; ++tempLen);
if(tempLen > maxLen){
maxLen = tempLen;
idx = i;
}
j += tempLen;
}else{
++j;
}
}
}
//print
for(int i =0; i < maxLen; ++i){
cout<<src[idx+i];
}
}

int main(){
char src[] = "aaacdefgaaaddedefg";
printMaxDuplication(src);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: