今年以來,351 款 App 因違法收集個人資訊被通報
阿新 • • 發佈:2021-08-21
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; }