面試算法:1.無重複字符的最長子串

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-jie-suan-fa-3-wu-zhong-fu-zi-fu-de-zui-chang-z/

示例 1:

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

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

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

思路
標籤:滑動窗口
採取滑動窗口的方法降低時間複雜度
定義一個 map 數據結構存儲 (k, v),其中 key 值爲字符,value 值爲字符位置 +1,加 1 表示從字符位置後一個纔開始不重複
我們定義不重複子串的開始位置爲 start,結束位置爲 end
隨着 end 不斷遍歷向後,會遇到與 [start, end] 區間內字符相同的情況,此時將字符作爲 key 值,獲取其 value 值,並更新 start,此時 [start, end] 區間內不存在重複字符
無論是否更新 start,都會更新其 map 數據結構和結果 ans。
時間複雜度:O(n)O(n)

代碼

public static int getStringLength(String str) {
        int ens = 0;
        Map<Character, Integer> map = new LinkedHashMap<>();
        for (int start = 0, end = 0; end < str.length(); end++) {
            Character ch = str.charAt(end);
            if (map.containsKey(ch)) {
                ens = Math.max(end - start, ens);
                start = map.get(ch);
            }
            map.put(ch, end + 1);

        }
        System.out.println("map" + JSON.toJSONString(map));
        return ens;
    }

public static void main(String[] args) {
        String str = "abcabcdedbb";
        int aaa = getStringLength(str);
        System.out.println(aaa);
}

畫解


 

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