求S串中最长的重复子串的位置和长度
1)自己的算法,时间复杂度(n*n*n)
void sub_long(const string& str1,int& i,int& j,int& len) { int curr=0; while(curr!=(str1-len+1)) { int next=curr+1; int n=curr; while(next!=(str1.length()-len+1)) { int sum=0; int m=next; while(m!=str1.length()) { if(str1[n]==str1[m]) { ++n; ++m; ++sum; } else { if(sum>len) {i=n;j=next;len=sum} break; } } ++next; n=curr; } ++curr; } }
2 时间复杂度为n*n的算法,主要利用KMP算法中next函数值得算法
算法分析:next[j]!=-1表示在第J个字符前面存在一个长度为next[j]-1的重复子串
由此,算法的基本思想为:从第一个字符开始的所有子串的next函数值,然后求每一组next中的最大值,然后比较每组next的最大值。
bool comp_str(const int& a,const int& b)
{
return a>b;
}
void get_next(const string& str,vector<int>& vec)
{
int i=0;
int j=-1;
vec[0]=-1;
while(i<str.size())
{
if(j==-1||str[i]==str[j])
{
++i;
++j;
vec[i]=j;
}
else
j=vec[j];
}
return;
}
int find_str_pos(const string& str1)
{
int i=0;
int pos=0;
int max_len=0;
while(i<str1.size())
{
string str2=str1.substr(i);
cout<<str2<<endl;
vector<int> vec(str2.size(),0);
get_next(str2,vec);
vector<int>::iterator ite=vec.begin();
// stable_sort(vec.begin(),vec.end(),comp_str);
int j=0;
while(j<str2.size())
{
if(max_len<vec[j])
{
max_len=vec[j];
pos=i;
}
++j;
}
if((vec[j-1]==max_len)&&(str2[j-1]==str2[str2.size()-1]))
{
++max_len;
}
++i;
}
cout<<max_len<<endl;
return pos;
}
int main()
{
string str1("abaabaaabaaaba");
/*vector<int> vec(str1.size());
get_next(str1,vec);
vector<int>::iterator ite=vec.begin();
while(ite!=vec.end())
{
cout<<*ite<<endl;
++ite;
}*/
int pos=find_str_pos(str1);
cout<<pos<<endl;
return 0;
}
浙公网安备 33010602011771号