思路分析

大概有思路,保留某一个字符上次出现的索引位置,出现重复字符就从上一次的后一位开始一个新的子串。
但是总体整理的时候有点抽象和凌乱,看了评论区第一个的非常简练巧妙的Python代码实现,才帮助自己理清了思路。
注意要考虑嵌套的重复字符的情况。

代码实现

  1. class Solution {
  2. public:
  3. int lengthOfLongestSubstring(string s) {
  4. int ans = 0;
  5. // 无重复字符子串的起始索引位置
  6. int head = 0;
  7. // 存储每个字符最新一次出现的索引位置的后一位
  8. unordered_map<char, int> lastIndex;
  9. for (int i = 0; i < s.size(); ++i){
  10. char ch = s[i];
  11. // 如果这个字符之前出现过
  12. // 更换新的子串, 从上一次出现位置的后一位开始
  13. // 取较大值防止嵌套出现重复字符的影响, 比如abba
  14. if (lastIndex.find(ch) != lastIndex.end()){
  15. head = max(head, lastIndex[ch]);
  16. }
  17. // 计算当前子串长度, 更新答案
  18. ans = max(ans, i - head + 1);
  19. // 记录该字符最新位置的后一位
  20. lastIndex[ch] = i + 1;
  21. }
  22. return ans;
  23. }
  24. };