滑动窗口方法解决子字符串匹配问题

滑动窗口方法解决子字符串匹配问题

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

思路

维护一个初始化为0的滑动窗口,并设置左右指针(初始时均指向第0个字符),循环移动右指针,当新移动到的字符出现在窗口内时,将左指针后移以便缩小窗口。如果没有出现过则扩大窗口。

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        set t;
        int res = 0, left = 0, right = 0;
        while (right < s.size()) {
            if (t.find(s[right]) == t.end()) {
                t.insert(s[right++]);
                res = max(res, (int)t.size());
            }  else {
                t.erase(s[left++]);
            }
        }
        return res;
    }
};

其他疑惑

当字符串形如“pwwkww”的形状时,left=0,right=1,set内保存的时p和w,此时当right继续右滑到2,w在set内出现。作者第一次到这里的时候总觉得此时右移left会出问题,但是实际操作中发现,如果right所指字符在set中出现,此时并没有右移right,仅仅左移left,此时set内只剩下w字符。但是因为right没有动,下一轮循环时right依然是2,w还是在set中出现过,所以左指针会继续右移,set也就被清空了,所以不会出现窗口内有重复字符的情况。

你可能感兴趣的:(滑动窗口方法解决子字符串匹配问题)