/*
* 题意:
* 如: 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++;
}
*/