求S字符串中最长重复子串

  1. /* 
  2. *   题意:  
  3. *   如: S = "abcdsetseabcd"  这个字符串中的最长重复子串就是abcd,长度为4 
  4.         S = "tmabcdefpiabcdef" 这个字符串的最长重复子串就是abcdef,长度为6 
  5.         S = "aaaaaaaa", 最长重复子串就是aaaaaaa,长度为7 
  6. * 
  7.      
  8.  
  9. *   分析:   利用的工具就是KMP字符串匹配里面用到过的Next值, 这种算法的复杂度可以降为N^2 
  10.             因为Next值的含义:  
  11.             Next[j] != 0 表明:在第j个字符之前存在一个长度为Next[j]-1的重复子串 
  12.             【注: Next算重复子串都是从第一个元素开始起算】 
  13. *           因此,算法的基本思想就是求出 串S中的每个子串的Next值,然后取其中Next值最大的 
  14.             既为最长重复子串,最大长度为: Max(Next值) - 1  
  15.             【注意如果字符串的最后一位字符也是重复子串中的一个,并且是最大的Next,那么它和其他位置的不一样,它的 Next不用-1】 
  16.             【求所有的子串 sub = SubString(S,i,strlen(S)-i+1); i=1,2,3....,len-1】 
  17. *            
  18.     实现代码: 
  19.             int i=1; 
  20.             int maxl = 0; 
  21.             int maxk = 0; 
  22.             int pos = 0;    //存取最大重复子串的起始位置!!! 
  23.             int len = strlen(S); 
  24.             while (len-i+1 > maxl) 
  25.             { 
  26.                 maxk = Max{Next(SubString(S, i, n-i+1))};   //求出子串中最大的maxk 
  27.                 if (maxk != Next[len] || S[len] != S[i+maxk-1]) //如果最大的重复子串包括最后一个字符,那么Next值就不用-1了.否则Next-1才为要求的长度 
  28.                 { 
  29.                     maxk--; 
  30.                 } 
  31.                 if (maxk > maxl) 
  32.                 { 
  33.                     maxl = maxk; 
  34.                     pos = i; 
  35.                 } 
  36.                 i++; 
  37.             } 
  38. */  


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值