Files
LeetCode/滑动窗口/1. 无重复字符的最长子串.md

1.4 KiB

无重复字符的最长子串

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

示例 1:

输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:

输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3:

输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

0 <= s.length <= 5 * 104 s 由英文字母、数字、符号和空格组成

思路

  • 滑动窗口
    • 区间
      • 不重复子串
    • 维护
      • 哈希表
      • HashMap<Character, Integer>

代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // Init
        int l = 0, r = 0;
        Map<Character, Integer> map = new HashMap<>();
        int ans = 0;

        // Traverse
        for (; r < s.length(); r++) {
            char cur = s.charAt(r);
            // EXIST
            if (map.containsKey(cur)) {
                l = map.get(cur);
                ans = Math.max(ans, r - l);
                l++;
                map.put(cur, r);
            }
            // NOT EXIST
            else {
                map.put(cur, r);
            }
        }
        return ans;
    }
}