無重複字元的最長子串問題 (移動視窗法求解)

星海無邊發表於2020-12-08

問題:給定一個字串,請你找出其中不含有重複字元的 最長子串 的長度。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        //本題採用滑動視窗來解決
        //記錄左邊界
        int left = 0;
        //記錄最大值
        int max = 0;
        //滑動視窗,用於裝字元子串
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        for(int i = 0; i < s.length(); i ++){
            //看是否有重複的部分
            if(map.containsKey(s.charAt(i))){
                //千萬要注意,這裡有一個加一
                left = left > (map.get(s.charAt(i)) + 1) ? left : (map.get(s.charAt(i)) + 1); 
            }
            map.put(s.charAt(i), i);
            max = max > (i - left + 1) ? max : (i - left + 1);
        }
        return max;
    }
}

小結:使用移動視窗法的時間複雜度是O(n),空間複雜度是O(m),這個是跟出現的子串有關的(PS:如果使用暴力求解法,兩個for迴圈遍歷頭和尾,然後用HashSet來儲存,時間複雜度為O(n^3),空間為O(m))

相關文章