题目大意:
给出一个由小写字母组成的字符串。你的任务是找出其最长的出现至少两次的子串的长度。
思路:
纯模拟。
这道题我用的是O(n^4)的方法。前两个循环分别枚举两个子串的起始位置,第三个循环枚举这两个字串的长度,最后一个循环用来比较两个子串是否相同。加上一点优化,AC!
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char a[201],b[201],c[201];
int n,maxn;
int main()
{
scanf("%s",&a);
n=strlen(a);
for (int i=0;i<=n-2;i++)
{
for (int j=i+1;j<=n-1;j++) //枚举子串开始位置
{
for (int k=1;k<=n-1;k++) //字串长度
{
int ok=1;
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for (int q=1;q<=k;q++) b[q]=a[q+i-1];
for (int q=1;q<=k;q++)
{
c[q]=a[q+j-1];
if (c[q]!=b[q]) //如果与另一个字串不相同
{
ok=0;
break; //退出
}
}
if (ok==1&&k>maxn) maxn=k;
else if (ok==0) break;
}
}
}
printf("%d\n",maxn);
return 0;
}