【leetcode】【java】【3、無重複字元的最長子串】

透明的阿爾馮斯 發表於 2020-12-04

我的解法:

    public int lengthOfLongestSubstring(String s) {
    	//先考慮邊界情況
        if(s.length()==0) {
            return 0;
        }
        if(s.length()==1) {
            return 1;
        }
        //使用一個set記錄是否重複
        Set<Character> set = new HashSet();
        int res = 1;
        for(int i=0;i<s.length();i++){
            //包含s[i]的最長串的值
            Character p = s.charAt(i);
            set.add(p);
            for(int j=i+1;j<s.length();j++){
                Character q = s.charAt(j);
                //如果重複,結束此次遍歷,i++,否則繼續向前遍歷,更新set集合與res
                if(set.contains(q)){
                    set.clear();
                    break;
                }else{
                    set.add(q);
                    res = Math.max(res, set.size());
                }
            }
        }
        return res;
    }

大神的解法:

    public int lengthOfLongestSubstring(String s) {
        if (s.length()==0) return 0;
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        int max = 0;
        int left = 0;
        for(int i = 0; i < s.length(); i ++){
            if(map.containsKey(s.charAt(i))){
            	//如果遇到重複值,左邊座標(從上一個位置)跳到該重複值的下一個位置
                left = Math.max(left,map.get(s.charAt(i)) + 1);
            }
            map.put(s.charAt(i),i);
            max = Math.max(max,i-left+1);
        }
        return max;
        
    }

作者:powcai
連結:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

本質上都是滑動窗,但是大神的解法更加優雅,通過map的key記錄出現的字母,value位置資訊。