class Solution {
public:
int lengthOfLongestSubstring(string s) {
// 哈希集合,记录每个字符是否出现过
unordered_set 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;
}
};
问:这段代码我没有找到他是如何判断指针内外有没有重复的字符,运用了什么原理
问: int rk = -1, 他的右指针的初始值是—1,那他的左指针的初始值呢。
问: // 枚举左指针的位置,初始值隐性地表示为 -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]);
这个从头到尾我都没见到他是如何判断是否有重复的字符,我只看到了左右指针不停地移动,他这个左右指针是如何协调的呢
要先明白一个方法: 设定从左指针到右指针中保存的是所有无重复的字符, 为了满足这个设定, 开始的时候, 把右指针初始化为-1, 左指针初始化为0, 这是为了保证刚开始遍历的时候左右指针之间一个字符都没有; 然后我们去移动右指针, 是去判断当前右指针的下一个字符是否与当前左右指针之间的值有重复, 所以要rk + 1, 然后再来看你的问题
答问1:通过字典occ中字符的个数判断, 即 occ.count(s[rk + 1] , 你的字典occ中保存的是当前左右指针之间的值, rk + 1是下一个字符, 只要occ中出现该字符的次数为零, 那么就说明下一个字符与左右指针之间的字符都不重复, 可以添加进occ中