滑动窗口方法解决子字符串匹配问题
思路
维护一个初始化为0的滑动窗口,并设置左右指针(初始时均指向第0个字符),循环移动右指针,当新移动到的字符出现在窗口内时,将左指针后移以便缩小窗口。如果没有出现过则扩大窗口。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
set<char> 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也就被清空了,所以不会出现窗口内有重复字符的情况。