无重复字符的最长子串

2019-08-17  本文已影响0人  漆黑烈焰武士G

无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

模板:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        
        //ASCII表共能表示256个字符
        int vec[256];//明明只是个数组不知道为啥起名叫vec
        //[-1,-1,-1,-1,-1,-1,……,-1,-1,-1]
        for(int i=0;i<256;i++)
            vec[i]=-1;
        
        int in=-1,maxx=0;
        
        for(int i=0;i<s.length();i++)//遍历字符串
        {
            //step2(再看这里)
            //当(vec[s[i]] > -1)的时候,说明vec已经经历了下面的赋值
            //之后的vec[s[i]]只要被赋值,就一定比in大
            //所以in值就是每次重复的时刻,也就是每次不重复字符串的起点
            //in只要被赋值就说明该字母已经重复过(最少这就是第一次)
            if(vec[s[i]] > in)
            {
                in= vec[s[i]];
            }
            
            vec[s[i]]=i;
            /*step1(先看这里)
                "pwwpew"所要经历的:
                vec[p] = 0;vec[w] = 1;vec[w] = 2;vec[p] = 3;vec[e] = 4;vec[w] = 6;
                遍历结束后:
                vec[p] = 3;vec[e] = 4;vec[w] = 6;
            */
     
            //step3(最后看这里)
            //i-in 就是每次循环与不重复字符串起点的差值
            //找到最大的差值并赋值即可
            if(maxx<i-in)
                maxx=i-in;
         }
            
        return maxx;
    }
    
};
上一篇 下一篇

猜你喜欢

热点阅读