最长不重复子串

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("\n");
28         //printf("len:%d\n",len);
29         //printf("arr:%s\n",arr);
30         printf("%d\n",maxlen);
31     }
32 
33     return 0;
34 }

上面是我的算法,从评测结果上时间性能只能说是一般,30Ms.记录一下,以备复习之用,欢迎大家点评。

核心思想是,相邻的两个字母记为  LR.记录L之后下一个L的位置(实际上是下个L之前的位置),R相同。即loc数组的作用。

第二个循环时,loc反向遍历,L的loc位置不能大于R的loc位置,想想就明白了,否则的话L内部就包含了一个有重复的子串。同时用loc-i+1更新最大子串的长度,即maxlen.

 

posted @ 2013-08-19 22:14  wmx3ng  阅读(382)  评论(0编辑  收藏  举报