欢迎来到王正伟的博客

返回顶部

3:无重复字符的最长子串(C++)

题目地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

题目描述

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

题目示例

示例 1:

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

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

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

输入: s = ""
输出: 0

解题思路

思路:滑动窗口+双指针。使用双指针i和j分别表示无重复子串的左右边界,滑动窗口的右边界不断将新元素加入窗口,当窗口内的元素不含有重复元素市,满足要求,否则不满足要求。此时,需要将滑动窗口的左边界i右移,移至重复元素的下一位置,并重新开始移动窗口的右边界j,一直维持这样的滑动窗口,记录窗口的最大长度。

程序源码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.empty()) return 0;
        int len = 0;
        unordered_map<char, int> dic; //存储最长子串
        int i = 0, j = 0; //i,j分别为不重复字符最长子串左右边界[i,j]
        while(j < s.size())
        {
            if(dic.find(s[j]) != dic.end()) //用m.count(s[j])>0也可判断是否已经存在该元素
            {
                i = max(i, dic[s[j]] + 1); //更新左边界为重复字符下一位置
            }
            dic[s[j]] = j;
            len = max(len, j - i + 1); 
            j++; //当前窗口无重复元素,右边界j一直右移
        }
        return len;
    }
};

 

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> visited;
        int len = 0;
        for (int left = 0, right = 0; right < s.size(); right++) {
            while (visited.count(s[right]) > 0) {
                visited.erase(s[left]);
                left++;
            }
            visited.insert(s[right]);
            len = max(len, right - left + 1);
        }

        return len;
    }
};

参考文章:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/shuang-zhi-zhen-hua-dong-chuang-kou-dong-tai-gui-2/

posted @ 2021-02-03 13:35  Mr.King~  阅读(380)  评论(0编辑  收藏  举报