滑动窗口—满足XX条件的最长子串
目錄
題目一:3. 無重復字符的最長子串
題目二:159. 至多包含兩個不同字符的最長子串
題目三:159. 至多包含兩個不同字符的最長子串
題目一:3. 無重復字符的最長子串
問題描述:
給定一個字符串,請你找出其中不含有重復字符的?最長子串?的長度。比如輸入: s = "abcabcbb",輸出: 3 ,解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。
算法思路:
暴力解法時間復雜度較高,會達到?,故而采取滑動窗口的方法降低時間復雜度。定義一個 map 數據結構存儲 (k, v),其中 key 值為字符,value 值為字符位置 +1,加 1 表示從字符位置后一個才開始不重復。我們定義不重復子串的開始位置為 start,結束位置為 end。隨著 end 不斷遍歷向后,會遇到與 [start, end] 區間內字符相同的情況,此時將字符作為 key 值,獲取其 value 值,并更新 start,此時 [start, end] 區間內不存在重復字符。無論是否更新 start,都會更新其 map 數據結構和結果 ans。
時間復雜度:O(n)。
上段文字出自: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/
圖解:
參考代碼:
class Solution {public int lengthOfLongestSubstring(String s) {int len = s.length();int res = 0;Map<Character,Integer> map = new HashMap<>();for(int end=0, start=0; end<len; end++){char alpha = s.charAt(end);if(map.containsKey(alpha))start = Math.max(start,map.get(alpha));res = Math.max(res, end-start+1);map.put(alpha,end+1);}return res;} }題目二:159. 至多包含兩個不同字符的最長子串
問題描述:
給定一個字符串 s ,找出?至多?包含兩個不同字符的最長子串 t ,并返回該子串的長度。比如輸入: "eceba",輸出: 3,解釋: t 是 "ece",長度為3。
算法思路:
為了遍歷一遍就得到答案,我們使用一個左指針和一個右指針表示滑動窗口的邊界。一開始,讓兩個指針都指向 0 ,當窗口包含的字符不超過 2 個不同的字符時,就不斷將右指針往右邊移動。如果在某一個位置有 3 個不同的字符,就開始移動左指針,直到窗口內包含不超過 2 個不同字符。
這就是基本的想法:沿著字符串移動滑動窗口,并保持窗口內只有不超過 2 個不同字符,同時每一步都更新最長子串的長度。
只有一個問題還沒解決 - 如何移動左指針確保窗口內只有 2 種不同的字符?我們使用一個 hashmap ,把字符串里的字符都當做鍵,在窗口中的最右邊的字符位置作為值。每一個時刻,這個 hashmap 包括不超過 3 個元素。
比方說,通過這個 hashmap ,你可以知道窗口 "eeeeeeeet" 中字符 e 最右邊的位置是 8 ,所以必須要至少將左指針移動到 8 + 1 = 9 的位置來將 e 從滑動窗口中移除。我們的方法時間復雜度是否是最優的呢?答案是是的。我們只將字符串的 N 個字符遍歷了一次,時間復雜度是O(N) 。
鏈接:https://leetcode-cn.com/problems/longest-substring-with-at-most-two-distinct-characters/solution/zhi-duo-bao-han-liang-ge-bu-tong-zi-fu-de-zui-chan/
參考代碼:
class Solution {public int lengthOfLongestSubstringTwoDistinct(String s) {int res = 0, len = s.length();HashMap<Character, Integer> hm = new HashMap<Character, Integer>();for(int end=0,start=0; end<len; end++){char alpha = s.charAt(end);if(hm.size()<3)hm.put(alpha,end);if(hm.size()==3){int index = Collections.min(hm.values());start = index + 1;hm.remove(s.charAt(index));}res = Math.max(res, end-start+1);}return res;} }題目三:159. 至多包含兩個不同字符的最長子串
問題描述:
給定一個字符串 s ,找出?至多?包含兩個不同字符的最長子串 t ,并返回該子串的長度。比如輸入: "eceba",輸出: 3,解釋: t 是 "ece",長度為3。
算法思路:
總結
以上是生活随笔為你收集整理的滑动窗口—满足XX条件的最长子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sklearn应用—高斯混合
- 下一篇: Hadoop—常见面试题