思路分析
大概有思路,保留某一个字符上次出现的索引位置,出现重复字符就从上一次的后一位开始一个新的子串。
但是总体整理的时候有点抽象和凌乱,看了评论区第一个的非常简练巧妙的Python代码实现,才帮助自己理清了思路。
注意要考虑嵌套的重复字符的情况。
代码实现
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int ans = 0;
// 无重复字符子串的起始索引位置
int head = 0;
// 存储每个字符最新一次出现的索引位置的后一位
unordered_map<char, int> lastIndex;
for (int i = 0; i < s.size(); ++i){
char ch = s[i];
// 如果这个字符之前出现过
// 更换新的子串, 从上一次出现位置的后一位开始
// 取较大值防止嵌套出现重复字符的影响, 比如abba
if (lastIndex.find(ch) != lastIndex.end()){
head = max(head, lastIndex[ch]);
}
// 计算当前子串长度, 更新答案
ans = max(ans, i - head + 1);
// 记录该字符最新位置的后一位
lastIndex[ch] = i + 1;
}
return ans;
}
};