[LeetCode#3][C]Longest Substring Without Repeating Characters

来源:互联网 发布:软件外包团队管理 编辑:程序博客网 时间:2024/05/03 01:52

作者:faaronzheng 转载请注明出处!

题目如下:

这里写图片描述

思路:

首先明确要求中的substring和subsequence的区别。实现的方法也有许多种,可以用三重循环(第一重遍历主串,第二重计算当前的最长子串,第三重保证当前子串中没有重复项)。但是这样时间复杂度太大,所以放弃(我没有用LeetCode提交,不知道会不会超时~)。我采用了一种间接的方法。虽然还有两重循环,但是勉强可以接受。

关键就在于使用一个数组减少三重循环中的最后一重(hash更好,这里用一个数组模拟hash的思想)。由于char和int存在相互转化的关系,我们可以用这个数组用来指示当前的字母或符号是否在当前的最长子串中出现过。

代码:

int lengthOfLongestSubstring(char* s) {    char *t=s;                           //子串    int max=0,i=0,j;                     //i和j分别记录当前子串的开始下标和结束下标    while(*(s+i)!='\0')    {          int a[128]={0};                  //记录当前的字母或符号是否在当前的最长子串中出现过。        j=i+1;        while(*(t+j)!='\0')       {           if(a[*(t+j)]==0&&*(s+i)!=*(t+j))           {                a[*(t+j)]=1;                j++;                max=j-i>max?j-i:max;           }           else           {               max=j-i>max?j-i:max;               i++;               break;           }       }       max=j-i>max?j-i:max;       if(*(t+j)=='\0')                //子串达到最大长度           return max;    }    return max;}

结果:

这里写图片描述

进阶:

在上面的基础上,我们可以进一步将循环降至一层。方法就是在所有循坏外定义一个存放最长子串的结构,再循环的时候动态修改当前的最长子串就可以了。最容易想到的当然还是用hash保存当前的最长子串。但是c语言还要自己实现。所以放弃,还是使用之前的数组模拟hash结构。只要将数组定义到所有循环外,在对程序做些小的修改就可以了~从结果可以看出,提升还是不少的~

代码:

int lengthOfLongestSubstring(char* s) {    int max=0,i=0,j=0;    int a[128]={0};                              //记录当前的最长子串。    while(*(s+i)!='\0'&&*(s+j)!='\0')    {          if(i==j||a[*(s+j)]==0&&*(s+i)!=*(s+j))        {            a[*(s+j)]=1;            j++;            max=j-i>max?j-i:max;        }        else        {            max=j-i>max?j-i:max;            a[*(s+i)]=0;            i++;        }    }    return max;}

结果:

这里写图片描述

0 0
原创粉丝点击