2022-04-13 「3. 无重复字符的最长子串」

2022-04-13  本文已影响0人  柠香萌萌鸡

今日中等题:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

这题其实上周就做到了,但是因为思路不对,测试用例通过率卡在879 / 987上过不去。

最初思路比较简单,就是用HashMap去存一个已经出现过的字符,也不关心value是多少,只要有已经存过的,就把这个时候的尾取出来,和头相减,获得差值+1就是长度。
再把长度和最大值做比较,取最大即可,使用的是Math.max()方法。

但是开始想到的就是头和尾分别通过for循环遍历,导致双重for循环,时间复杂度高。

参考题解后发现,其实头可以固定不动,只遍历尾即可,如果遇到了重复字符,记录下当下长度后,把头换成重复字符中,位数更大的那一位即可。

看下代码:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s.length()==0) return 0;
        int ans = 0;
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        int head = 0;
        for (int i=0;i<s.length();i++) {
            if (map.containsKey(s.charAt(i))) {
                // 把头换成重复字符中,位数更大的一位
                head = Math.max(map.get(s.charAt(i)), head);
            }
            ans = Math.max(ans, i-head +1);
            map.put(s.charAt(i), i+1);
        }
        return ans;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读