思路分析
大概有思路,保留某一个字符上次出现的索引位置,出现重复字符就从上一次的后一位开始一个新的子串。
但是总体整理的时候有点抽象和凌乱,看了评论区第一个的非常简练巧妙的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];// 如果这个字符之前出现过// 更换新的子串, 从上一次出现位置的后一位开始// 取较大值防止嵌套出现重复字符的影响, 比如abbaif (lastIndex.find(ch) != lastIndex.end()){head = max(head, lastIndex[ch]);}// 计算当前子串长度, 更新答案ans = max(ans, i - head + 1);// 记录该字符最新位置的后一位lastIndex[ch] = i + 1;}return ans;}};
