题目描述:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
![](https://i-blog.csdnimg.cn/blog_migrate/bab76c1de44ebc3ea413bd88140bd539.png)
代码解析:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> occ;//借用 unordered_set 容器
int n = s.size();//n为字符串中字符的个数
int rk = -1, ans = 0;//rk用于遍历(充当右指针),ans用于记录输出
//滑动窗口思路解析
//首先rk开始进行遍历,当没有遍历完所有元素且当前遍历的元素在occ中还没有出现过的话,则将其加入到occ中
//while循环退出条件有两个
//1. 遍历完所有元素->当这种情况退出时即可结束
//2. 当前遍历字符与之前重复->当出现重复时就删除掉遍历开始的第一个元素(因为可以确保第第 i 到 rk 个字符是一个极长的无重复字符子串)
for(int i = 0;i < n; ++i)
{
if(i != 0)
{
occ.erase(s[i-1]);//erase 删除操作 相当于左指针右移
}
while (rk + 1 < n && !occ.count(s[rk+1]))//count 会返回当前字符的出现次数
{
occ.insert(s[rk + 1]);//insert 插入操作 相当于不断右移右指针
++rk;
}
ans = max(ans,rk-i+1);
}
return ans;
}
};