这个是牛客的原题链接题目链接,因为在网上看到一位大神的代码写的很好,但是没有仔细讲解所以我写这篇博客讲解一下代码以后自己复习也方便:
我们假设给定的字符串中重复的片段长度为i,不重复的长度为s,字符串的总长度为len,那么三者满足关系2*i+s=len,而这个重复片段最长就是len/2,题目要求最长重复子串长度,我们可以从i=len/2开始倒着枚举,检查到底是满足哪个重复长度,第一个满足的肯定就是最长的而对应的s当然要从0开始。
下面我们先写一个函数来检查当前长度下是否是重复的:
bool judge(string &a,int s,int len)
{
for(int i=s;i<s+len;i++){
if(a[i]!=a[i+len])return 0;
}
return 1;
}
功能十分简单一看就会了,然后我们开始按照上面的想法进行枚举:
int solve(string a) {
int len=a.size();
for(int i=len/2;i;i--)
{
for(int s=0;s<=len-i*2;s++)
{
if(judge(a,s,i))
return 2*i;
}
}
return 0;
}