求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;
}

 

 

 

  

posted on 2015-08-04 15:26  菜鸟基地  阅读(209)  评论(0)    收藏  举报

导航