最长重复子串(kmp实现)

cpp 代码
 
  1. #include <iostream></iostream>  
  2. #include <string></string>  
  3. #define MAXN 100000  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.         char str[MAXN];  
  8.         int next[MAXN];  
  9.         int maxpos = 0;  
  10.         int maxlen = 0;
  11.         cin >> str;  
  12.         int len = strlen(str); 
  13.         for (char *s = str; s[0] != '\0' && len > maxlen; s++, len--) {  
  14.                 next[0] = -1;  
  15.                 for (int i = 1, j = 0; i < len; i++, j++) {  
  16.                         while (j >= 0 && s[i] != s[j]) j = next[j];  
  17.                         next[i] = j;  
  18.                         if (j > maxlen) {  
  19.                                 maxpos = i + s - str - j;  
  20.                                 maxlen = j;  
  21.                         }  
  22.                 }  
  23.         }  
  24.         cout << "result : " << maxpos << ' ' << maxlen  + 1 << endl;  
  25. }  

时间复杂度为O(n^2),但是实现非常简单,如果不考虑编程痛苦用后缀树的话,可以用
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值