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