最长无重复子串(滑动窗口的使用)

前几天忽觉自己颓废,遂开始做题,然后在领扣中做到了第三题,也就是最长无重复子串。
题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
小白的第一感觉肯定是暴力法,可是会导致时间超限。然后看了看大神题解,提到了一个双指针的滑动窗口,就是设立一个开始标志,一个结束标志,判断结束标志的字符是否存在于子串之中,若是则结束标志向后移动,并判断是否当前最大值和子串长度,若不是则开始标志向后移动,直到结束标志到达字符串末端。
附上已ac的代码:

class Solution {
     
public:
    int lengthOfLongestSubstring(string s) {
     
            int i=0,j=1,max=1,chars[128];
            memset(chars,0,128*sizeof(int));
            int len=s.length();
            if(len==0)
                return 0;
            else
                chars[(s[0])]=1;  
           for(;j<len;)
            {
     
                if(chars[s[j]]==0)
                {
     
                     int tem=j-i+1;
                     max=max>tem?max:tem;
                     chars[s[j]]=1;
                     ++j;
                 }
                else
                {
     
                     chars[s[i]]=0;
                     ++i;
                }   
            }
            return max;
    }
};

经过实践还发现一个很奇怪的现象,在领扣里面for会比while略快一点,可是正常来说理应是反过来的,这个留待以后实践观察。

你可能感兴趣的:(字符串)