题目描述:
最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的。
-
输入:
-
输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于10000。
输出:
-
对于每组测试用例,输出最大长度的不重复子串长度。
样例输入:
absd
abba
abdffd 样例输出: 4 2 4
分析:
我们只用记录当前出现的字符的上一次出现的位置。
如果它已经出现过在当前记录的串中,我们就更新
目前的串的长度。
如果没有出现过的话或者出现的当前串之前
当前串的长度+1.
时间复杂度O(n);
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10010;
char a[maxn];
int vis[300];
int main()
{
while(~scanf("%s",a)){
memset(vis,-1,sizeof(vis));
int ans = 0;
int start_id=0;
int last_start = 0;
int curlen = 1;
vis[a[0]]=0;
for(int i=1;i<strlen(a);i++){
if(vis[a[i]]==-1) curlen++;
else{
if(vis[a[i]]>=last_start){
last_start=vis[a[i]]+1;
curlen=i-last_start+1;
}
else
curlen++;
}
vis[a[i]]=i;
if(curlen>ans)
ans = curlen,start_id = i - ans + 1;
}
printf("%d\n",ans);
for(int i = start_id;i<start_id+ans;i++)
printf("%c",a[i]);
puts("");
}
return 0;
}