LeetCode 3. 無重複字符的最長子串

無重複字符的最長子串

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

示例 1:

輸入: “abcabcbb”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “abc”,所以其長度爲 3。

示例 2:

輸入: “bbbbb”
輸出: 1
解釋: 因爲無重複字符的最長子串是 “b”,所以其長度爲 1。

示例 3:

輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。

解題思路

採用滑動窗口的方式,遍歷一次字符串就可以找到結果,也就是時間複雜度爲O(n)。
使用HashMap來存儲已經遍歷過的字符,檢查重複的複雜度就只有O(1)了。
我們使用 HashMap將字符存儲在當前窗口 [i, j)(最初 j = i)中。 然後我們向右側滑動索引 j,如果它不在 HashMap中,我們會繼續滑動 j。直到 s[j] 已經存在於 HashMap中。此時,我們找到的沒有重複字符的最長子字符串將會以索引 i 開頭。如果 s[j] 在 [i, j) 範圍內有與 j’ 重複的字符,我們不需要逐漸增加 i ,我們可以直接跳過 [i,j’]範圍內的所有元素,並將 i 變爲 j’ + 1。

AC代碼

public static int lengthOfLongestSubstring(String s) {
        int length = s.length();
        int result = 0;
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        int start = 0;
        for (int i = 0; i < length; i++) {
            if (map.containsKey(s.charAt(i))) {
                start = Math.max(start, map.get(s.charAt(i)) + 1);
            }
            result = Math.max(result, i - start + 1);
            map.put(s.charAt(i), i);
        }

        return result;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章