3. 无重复字符的最长子串

题目描述:

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

示例 1:

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

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

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

 

思想:滑动窗口

本题比leetcode76,438,567更简单,只需要简单的更新计数器 window 即可,当 window[c] 值大于 1 时,说明窗口中存在重复字符,不符合条件,就该移动 left 缩小窗口了。

唯一需要注意的是,在哪里更新结果长度len 。要的是最长无重复子串,哪一个阶段可以保证窗口中的字符串是没有重复的呢

这里和之前不一样,要在收缩窗口完成后更新 len,因为窗口收缩的 while 条件是存在重复元素,换句话说也就是收缩完成后一定保证窗口中没有重复。

 

代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int len = 0;   //s可能为空
        unordered_map<char,int> window,need;
        int left=0,right=0;
        while(right<s.size()){
            char c = s[right];
            right++;
            window[c]++;
            while(window[c]>1){   //当window[c]>1时辨明window内有重复元素,需要移动left
                char d = s[left];
                left++;
                window[d]--;
            }
            len = max(len,right-left);
        }
        return len;
    }
};

 

posted @ 2020-05-09 16:01  thefatcat  阅读(83)  评论(0编辑  收藏  举报