3. Longest Substring Without Repeating Characters

June-12-2019
直观做法是保持滑窗,滑窗内出现的字母用MAP记录位置。
单向扩大滑窗,发现已出现字母,要查上次出现的位置,移动左指针。
一开始考虑的是移动左指针之后,要从MAP中删除移动过程中的字母,其实不用,
因为继续的时候,发现MAP中的字母出现在滑窗外,证明是应该被删除的,所以需要更新最大值,但不应该把左指针移动到上次出现位置的下一个。
left = Math.max(left, map.get(c) + 1)就是上面描述的

    public int lengthOfLongestSubstring(String s) {
        if (s == null) return 0;
        int res = 0;
        Map<Character, Integer> dictMap = new HashMap<>();
        int l = 0;
        for (int i = 0; i < s.length(); i ++) {
            char c = s.charAt(i);
            if (dictMap.containsKey(c)) {
                l = Math.max(l, dictMap.get(c) + 1);   
            }
            res = Math.max(res, i - l + 1);
            dictMap.put(c, i);
            
        }
        return res;
    }
posted @ 2016-12-27 10:52  哇呀呀..生气啦~  阅读(111)  评论(0编辑  收藏  举报