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

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

程序员文章站 2022-03-22 12:43:34
...

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

import java.util.HashMap;
import java.util.Map;

class Solution {

    public int lengthOfLongestSubstring(String s) {

        int res = 0;
        int len = 0;
        int idx = 0;

        // 某个字符 + 出现位置
        Map<Character, Integer> map = new HashMap<>();
        Map<Integer, Character> map1 = new HashMap<>();

        for(int i=0; i<s.length(); i++){

            if(!map.containsKey(s.charAt(i))){
                map.put(s.charAt(i), i);
                map1.put(i, s.charAt(i));
                len += 1;
            }else {
                res = Math.max(len, res);
                int index = map.get(s.charAt(i));

                for(int j = idx; j <= index; j++){
                    map.remove(map1.get(j));
                    map1.remove(j);
                }
                idx = index+1;
                len = i - index;
                map.put(s.charAt(i), i);
                map1.put(i, s.charAt(i));
            }
        }

        res = Math.max(len, res);
        return res;
    }

    public static void main(String[] args) {
        Solution s = new Solution();

        s.lengthOfLongestSubstring("pwwkew");
    }
}

每次遇到重复的值的时候,去取现在取到的最大值就可以啦! 

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