给定一个字符串 s ,请你找出其中不含有重复字符串最长子串的长度。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//哈希集合,记录每个字符是否之前出现过
unordered_set<char> occ;
int n=s.size();
//右边指针,初始值为-1,相当于我们在字符串左边界的左侧,还没有开始移动
int rk =-1, ans=0;
//枚举左指针的位置,初始值隐性表示为-1
for(int i=0; i<n; ++i)
{
if(i!=0)
{
//左指针向右移动一格,移除一个字符
occ.erase(s[i-1]);
}
while(rk+1<n&&!occ.count(s[rk+1]))
{
//不断移动右指针
occ.insert(s[rk+1]);
++rk;
}
//第 i 到rk个字符是一个极长无重复的字符子串
ans=max(ans,rk-i+1);
}
return ans;
}
};
改进:
滑动窗口的 左指针不需要一个个移动,遇到重复的字符时,可以跳跃移动,比如 “abcdefdhjk” 这种,当右指针移动到第二个d的时候,左指针可以直接到第一个d的下一个位置,即 e 开始