程序:C++利用简单模式匹配方法求串s中出现的第一个最长重复子串的下标和长度

利用简单模式匹配方法求串s中出现的第一个最长重复子串的下标和长度

直接看代码:

# include"shunxuchuan.cpp" 
# include
SqString *MaxSubstr(SqString s, int &maxi)//求最长重复子串,返回顺序串 
{
   SqString * subs;//用来存储子串 
   maxi=0;int maxlength=0,length,i=0,j,k;//最长重复子串下标和长度初始值设为0 
   while(i<s.length)//外部循环,重复循环串s中的每一个字符
   {  
      j=i+1;
      while(j<s.length)
      {
        if(s.data[i]==s.data[j]) //找一子串,以data[i]开头的字符,序号为i,长度为length 
         {
           length=1;
           for(k=1;s.data[i+k]==s.data[j+k];k++)
               length++;
           if(length>maxlength) //将较大长度者赋给maxi和maxlength 
              {
			     maxi= i;
                 maxlength= length;
              }
           j+=length;
         }
        else j++;
      }
     i++;//继续扫描下标为i字符之后的字符 
   }
   subs=(SqString *)malloc(sizeof(SqString));//分配空间 
   subs->length=maxlength;
   for (i=0;i<maxlength; i++) //将最长重复子串复制到subs中 
       subs->data[i]=s.data[maxi+i];
   return subs;
}

int main() 
{
    SqString s,* subs;int maxi;
    StrAssign(s,"buabcdhtabcdhhhft");
    printf("字符串:");DispStr(s);
    subs =MaxSubstr(s,maxi);
    printf("最长重复子串:");
    DispStr(*subs);
    printf("下标为:%d\n",maxi); 
    printf("长度为:%d\n",subs->length);
    DestroyStr(s);
	free(subs);
    return 1;

小结:程序的主要设计思路为扫描串s,将当前下标为i的字符通过与其后面的字符相比较,如果有相同的字符就设其下标为j,然后两个字符再通过同时后移循环比较它们后面的字符是否相等,若相等,则字符串的长度要相应的跟着增加,直到遇到不相等的字符跳出循环,然后再通过比较重复字符串的长度将每一次比较长的重复字符串的下标和长度赋值给maxi和maxlength,之后再将下标为i的元素和j+length后面的字符进行如上操作的比较,直到j大于等于串s的长度时跳出,再将i增加,循环扫描下标为i之后的所有字符,重复上面的操作,最终得出最长重复子串的开始的下标位置和长度。

你可能感兴趣的:(程序:C++利用简单模式匹配方法求串s中出现的第一个最长重复子串的下标和长度)