1. 程式人生 > 資訊 >今年以來,351 款 App 因違法收集個人資訊被通報

今年以來,351 款 App 因違法收集個人資訊被通報

3.無重複字元的最長子串

題目描述

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

思路

其實就是一個佇列,比如例題中的 abcabcbb,進入這個佇列(視窗)為 abc 滿足題目要求,當再進入 a,佇列變成了 abca,這時候不滿足要求。所以,我們要移動這個佇列!

如何移動?

我們只要把佇列的左邊的元素移出就行了,直到滿足題目要求!

一直維持這樣的佇列,找出隊列出現最長的長度時候,求出解!

時間複雜度:O(n)O(n)

程式碼

/**
     * 滑動視窗
     * @source https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai/
     * @param s
     * @return
     */
    public static int lengthOfLongestSubstring(String s) {
        if (s.length() == 0) {
            return 0;
        }
        HashMap<Character, Integer> map = new HashMap<>();
        int max = 0;
        int left = 0;
        for (int i = 0; i < s.length(); i++) {
            if (map.containsKey(s.charAt(i))) {
                //找出重複元素的index,算出截去前面部分的長度 => left
                left = Math.max(left, map.get(s.charAt(i)) + 1);
            }
            map.put(s.charAt(i), i);
            //i-left + 1 為當前長度,與 最大長度比較 取最大
            max = Math.max(max, i - left + 1);
        }
        return max;
    }