题意:要养成读完题之后能总结出题目要干什么,本题就是求最长的不重复的连续子串的长度。
数据1e7一秒所以得在O(n)的时间内完成
方法:不断更新维护区间的长度
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[10000010];
int main()
{
//std::ios::sync_with_stdio(false);
int n,mark[150],st,ansst,len,maxn,i;
//string s;
while(scanf("%d",&n)!=-1)
{
//cin>>s;
scanf("%s",s);
maxn=0;
len=0;
st=0;
ansst=0;
memset(mark,-1,sizeof(mark));//标记该字母的位置
for(i=0;i<n;i++)
{
if(mark[s[i]]<st)//该字母在区间外侧,不在区间内,区间长度加一
len++;
else
{
if(maxn<len)
{
maxn=len;
ansst=st;//ansst是输出结果的左端点
}
st=mark[s[i]]+1;
len=i-st+1;//i是区间右端点
}
mark[s[i]]=i;
}
if(maxn<len)
{
maxn=len;
ansst=st;
}
printf("%d %d %d\n",maxn,ansst,maxn-1+ansst);
}
}
//人一我百,人百我万
//时间