FROM: http://ac.jobdu.com/problem.php?pid=1530
- 题目描述:
-
最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的。
- 输入:
-
输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于10000。
- 输出:
-
对于每组测试用例,输出最大长度的不重复子串长度。
- 样例输入:
-
absd abba abdffd
- 样例输出:
-
4 2 4
- 来源:
- 阿尔卡特2013年实习生招聘笔试题
-
1 #include<cstring> 2 #include<cstdio> 3 int main() 4 { 5 char arr[10001],tmp; 6 int loc[10000],i,j,maxlen; 7 while(scanf("%s",arr)==1) 8 { 9 int len=strlen(arr); 10 for(i=0;i<len;i++) 11 { 12 j=i+1; 13 while(j<len&&arr[j]!=arr[i]) 14 j++; 15 loc[i]=j-1; 16 } 17 maxlen=1; 18 for(i=len-2;i>=0;i--) 19 { 20 if(loc[i]>loc[i+1]) 21 loc[i]=loc[i+1]; 22 if(loc[i]-i+1>maxlen) 23 maxlen=loc[i]-i+1; 24 } 25 //for(i=0;i<len;i++) 26 //printf("%d",loc[i]); 27 //printf(" "); 28 //printf("len:%d ",len); 29 //printf("arr:%s ",arr); 30 printf("%d ",maxlen); 31 } 32 33 return 0; 34 }
上面是我的算法,从评测结果上时间性能只能说是一般,30Ms.记录一下,以备复习之用,欢迎大家点评。
核心思想是,相邻的两个字母记为 LR.记录L之后下一个L的位置(实际上是下个L之前的位置),R相同。即loc数组的作用。
第二个循环时,loc反向遍历,L的loc位置不能大于R的loc位置,想想就明白了,否则的话L内部就包含了一个有重复的子串。同时用loc-i+1更新最大子串的长度,即maxlen.