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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值