//1460 我在哪
暴力方法改了40分钟,好在ac了
思路:依次枚举所有字符(外层循环);
第一个没有注意的点:没有加j的中间那层循环,直接用的while,这样会导致i后面可能有多个j的位置与i匹配,这样按着第一个匹配的匹配下去了,后面无法匹配上j就一直向后走。导致缺失情况
第二个:本质上还是一样的问题,while结束后,也就是某个匹配的结果看完了,要注意把开始匹配的位置还回到i。
#include<bits/stdc++.h>
using namespace std;
//1460. 我在哪? 暴力枚举
const int N=1e2+10;
char s[N];
int n;
int main()
{
cin>>n;
int ii,jj,qi;
scanf("%s",s);
int ans=-1*N;
for(int i=0; i<n; i++)
{
int res=0;
int l=i;
for(int j=i+1; j<n; j++)
{
int r=j;
while(r<n)
{
if(s[r]==s[l])
{
l++,r++,res++;
}
else
{
break;
}
}
l=i;
ans=max(ans,res);
res=0;
}
}
cout<<ans+1<<endl;//找不出来哪里错了;
}
二分的本质没理解透:
不是看不到有序的东西就不能用二分去做。
可以用二分的本质是进行完某次判断可以进一步缩短结果的范围
l=1;r=n;先看看长度为mid的有没有重复,没有的话就找小于mid的子串。
有重复子串,(为什么不看小的