• 最长不重复子串


    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.

  • 相关阅读:
    山东省网络安全技能大赛 部分writeup
    网络安全实验室--SQL注入关
    PHP命令执行与防范
    练习平台,学习网站
    实验吧 简单的SQL注入1
    网络安全相关书籍
    Redtiger SQL注入练习(一)
    Redtiger SQL注入练习(二)
    南邮。。。综合题
    实验吧:让我进去
  • 原文地址:https://www.cnblogs.com/wmx3ng/p/3269034.html
Copyright © 2020-2023  润新知