欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

剑指 Offer 48. 最长不含重复字符的子字符串

程序员文章站 2022-07-14 07:58:54
...

LeetCode: 剑指 Offer 48. 最长不含重复字符的子字符串

剑指 Offer 48. 最长不含重复字符的子字符串




剑指 Offer 48. 最长不含重复字符的子字符串

根据题目提示: 哈希表、双指针
滑动窗口

  1. 定义需要用到的变量: map 、fast 快指针、slow 慢指针
  2. slow 记录滑动窗口的起始 (即重复元素的下标 index + 1 的位置)
  3. fast 遍历整个 string, 遇到重复的元素停下 >> 进行slow、mx 、map 更新等

剑指 Offer 48. 最长不含重复字符的子字符串




滑动窗口

维护一个元素不重复的窗口



    public int lengthOfLongestSubstring(String s) {
        if("".equals(s) || s.length() == 0) return 0;
        if(s.length() == 1) return 1;
        int ans = 0;

        // 滑动窗口
        int fast = 1, slow = 0;
        // 记录字符下标
        Map<Character, Integer> map = new HashMap<>();
        char[] chars = s.toCharArray();
        map.put(chars[slow], slow);

        int mx = 1;
        while (fast < s.length()){
            if(map.containsKey(chars[fast])){
                // 包含  >> 出现重复了
                ans = Math.max(ans, mx);
                // 相同字符的前一个下标
                Integer index = map.get(chars[fast]);
                // 与 slow 的距离
                int dis = index - slow + 1;
                // 更新 mx
                mx -= dis;
                // 清空多余的字符记录
                for (int i = slow; i <= index; i++) {
                    map.remove(chars[i]);
                }
                slow = index+1;
            } 
            mx++;
            map.put(chars[fast], fast);
            fast++;
            if(fast == s.length()) return Math.max(ans, mx);
        }

        return ans;
    }



剑指 Offer 48. 最长不含重复字符的子字符串





剑指 Offer 48. 最长不含重复字符的子字符串

内容: d v d f
下标: 0 1 2 3
遇到 第二个 d(index = 2)时 >> slow 更新到 index = 1 >> index + 1



解题思路:

剑指 Offer 48. 最长不含重复字符的子字符串