Leetcode

模板

题解

3. 无重复字符的最长子串

3.无重复字符的最长子串.png
这一题比较简单,但是容易和其它题混淆。需要注意以下几点:

  1. 使用一个 HashMap 记录窗口内各个字符出现次数。
  2. 指针 right 不断向右移动,每移动一个字符,就更新该字符在窗口中的次数 +1
  3. 收缩窗口时机:当前正在被添加的字符次数 >1 时,需要收缩窗口,直到该字符在窗口出现次数 =1 ,停止收缩窗口。
  4. 计算 maxLen,此时整个窗口的状态就是没有重复字符的状态,可以计算 maxLen

    1. class Solution {
    2. public int lengthOfLongestSubstring(String s) {
    3. if (s == null || s.length() == 0) return 0;
    4. int left = 0, right = 0, maxLen = 0;
    5. Map<Character, Integer> windows = new HashMap<>();
    6. while (right < s.length()) {
    7. char add = s.charAt(right);
    8. right++;
    9. windows.put(add, windows.getOrDefault(add, 0) + 1);
    10. while (windows.get(add) > 1) {
    11. char remove = s.charAt(left);
    12. windows.put(remove, windows.get(remove) - 1);
    13. left++;
    14. }
    15. if (right - left > maxLen) {
    16. maxLen = right - left;
    17. }
    18. }
    19. return maxLen;
    20. }
    21. }