[剑指 Offer 48. 最长不含重复字符的子字符串]

58 阅读1分钟

剑指 Offer 48. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:

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

示例 2:

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

示例 3:

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

采用双指针滑动窗口的思想来解决问题

right指针往右走

若right指针指向的元素未在set中出现,则right++,并且更新maxlen

若right指针指向的元素在set中出现了,则left++,并且清除set中s[left];

循环操作

set操作
set<char> window;

window.insert(x);
window.erase(x);
window.find(x)==window.end() //未找到该元素

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left = 0;
        int right = 0;
        int maxlen = 0;
        set<char> window;
        while(right<s.size()){
            if(window.find(s[right])==window.end()){
                window.insert(s[right]);
                right++;
                maxlen = max(right-left,maxlen);
            }
            else{
                // while(window.find(s[right])!=window.end()){
                //     window.erase(s[left]);
                //     left++;
                // }
                // window.insert(s[right]);
                // right++;

                window.erase(s[left]);
                left++;
            }
        }
        return maxlen;
    }
};