标签:
题目描述:最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的。
输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于10000。
对于每组测试用例,输出最大长度的不重复子串长度。
分析:
我们只用记录当前出现的字符的上一次出现的位置。
如果它已经出现过在当前记录的串中,我们就更新
目前的串的长度。
如果没有出现过的话或者出现的当前串之前
当前串的长度+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; }
标签:
原文地址:http://blog.csdn.net/bigbigship/article/details/45575053