滑動窗口 合集

3. 無重復(fù)字符的最長子串

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

76.最小覆蓋子串

給你一個字符串 s 、一個字符串 t 。返回 s 中涵蓋 t 所有字符的最小子串。如果 s 中不存在涵蓋 t 所有字符的子串,則返回空字符串 "" 袄膏。
注意:

  • 對于 t 中重復(fù)字符,我們尋找的子字符串中該字符數(shù)量必須不少于 t 中該字符數(shù)量掺冠。
  • 如果 s 中存在這樣的子串沉馆,我們保證它是唯一的答案。
    輸入:s = "ADOBECODEBANC", t = "ABC"
    輸出:"BANC"
class Solution {
    public String minWindow(String s, String t) {
        if (s == null || s.length() == 0 || t == null || t.length() == 0){
            return "";
        }
        int[] need = new int[128];
        //記錄需要的字符的個數(shù)
        for (int i = 0; i < t.length(); i++) {
            need[t.charAt(i)]++;
        }
        //l是當(dāng)前左邊界德崭,r是當(dāng)前右邊界斥黑,size記錄窗口大小,count是需求的字符個數(shù)眉厨,start是最小覆蓋串開始的index
        int l = 0, r = 0, size = Integer.MAX_VALUE, count = t.length(), start = 0;
        //遍歷所有字符
        while (r < s.length()) {
            char c = s.charAt(r);
            if (need[c] > 0) {//需要字符c
                count--;
            }
            need[c]--;//把右邊的字符加入窗口
            if (count == 0) {//窗口中已經(jīng)包含所有字符
                while (l < r && need[s.charAt(l)] < 0) {
                    need[s.charAt(l)]++;//釋放右邊移動出窗口的字符
                    l++;//指針右移
                }
                if (r - l + 1 < size) {//不能右移時(shí)候挑戰(zhàn)最小窗口大小锌奴,更新最小窗口開始的start
                    size = r - l + 1;
                    start = l;//記錄下最小值時(shí)候的開始位置,最后返回覆蓋串時(shí)候會用到
                }
                //l向右移動后窗口肯定不能滿足了 重新開始循環(huán)
                need[s.charAt(l)]++;
                l++;
                count++;
            }
            r++;
        }
        return size == Integer.MAX_VALUE ? "" : s.substring(start, start + size);
    }
}

// python寫法
class Solution:
    def minWindow(self, s: 'str', t: 'str') -> 'str':
        from collections import defaultdict
        lookup = defaultdict(int)
        for c in t:
            lookup[c] += 1
        start = 0
        end = 0
        min_len = float("inf")
        counter = len(t)
        res = ""
        while end < len(s):
            if lookup[s[end]] > 0:
                counter -= 1
            lookup[s[end]] -= 1
            end += 1
            while counter == 0:
                if min_len > end - start:
                    min_len = end - start
                    res = s[start:end]
                if lookup[s[start]] == 0:
                    counter += 1
                lookup[s[start]] += 1
                start += 1
        return res

159. 至多包含兩個不同字符的最長子串

給定一個字符串 s 憾股,找出 至多 包含兩個不同字符的最長子串 t 鹿蜀。
示例 1:
輸入: "eceba"
輸出: 3
解釋: t 是 "ece",長度為3服球。

class Solution:
    def lengthOfLongestSubstringTwoDistinct(self, s: str) -> int:
        from collections import defaultdict
        lookup = defaultdict(int)
        start = 0
        end = 0
        max_len = 0
        counter = 0
        while end < len(s):
            if lookup[s[end]] == 0:
                counter += 1
            lookup[s[end]] += 1
            end +=1
            while counter > 2:
                if lookup[s[start]] == 1:
                    counter -= 1
                lookup[s[start]] -= 1
                start += 1
            max_len = max(max_len, end - start)
        return max_len

340. 至多包含 K 個不同字符的最長子串

class Solution:
    def lengthOfLongestSubstringKDistinct(self, s: str, k: int) -> int:
        from collections import defaultdict
        lookup = defaultdict(int)
        start = 0
        end = 0
        max_len = 0
        counter = 0
        while end < len(s):
            if lookup[s[end]] == 0:
                counter += 1
            lookup[s[end]] += 1
            end += 1
            while counter > k:
                if lookup[s[start]] == 1:
                    counter -= 1
                lookup[s[start]] -= 1
                start += 1
            max_len = max(max_len, end - start)
        return max_len
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茴恰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斩熊,更是在濱河造成了極大的恐慌往枣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粉渠,死亡現(xiàn)場離奇詭異分冈,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)霸株,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門雕沉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人去件,你說我怎么就攤上這事坡椒〗戎” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵肠牲,是天一觀的道長。 經(jīng)常有香客問我靴跛,道長缀雳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任梢睛,我火速辦了婚禮肥印,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绝葡。我一直安慰自己深碱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布藏畅。 她就那樣靜靜地躺著敷硅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愉阎。 梳的紋絲不亂的頭發(fā)上绞蹦,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音榜旦,去河邊找鬼幽七。 笑死,一個胖子當(dāng)著我的面吹牛溅呢,可吹牛的內(nèi)容都是我干的澡屡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼咐旧,長吁一口氣:“原來是場噩夢啊……” “哼驶鹉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起休偶,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤梁厉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踏兜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體词顾,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年碱妆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肉盹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡疹尾,死狀恐怖上忍,靈堂內(nèi)的尸體忽然破棺而出骤肛,到底是詐尸還是另有隱情,我是刑警寧澤窍蓝,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布腋颠,位于F島的核電站,受9級特大地震影響吓笙,放射性物質(zhì)發(fā)生泄漏淑玫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一面睛、第九天 我趴在偏房一處隱蔽的房頂上張望絮蒿。 院中可真熱鬧,春花似錦叁鉴、人聲如沸土涝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽但壮。三九已至,卻和暖如春常侣,著一層夾襖步出監(jiān)牢的瞬間茵肃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工袭祟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留验残,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓巾乳,卻偏偏與公主長得像您没,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胆绊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.無重復(fù)字符的最長子串(3 - 中/劍指48) 題目描述:給定一個字符串氨鹏,請你找出其中不含有重復(fù)字符的 最長子串...
    _code_x閱讀 1,335評論 2 6
  • 前言 滑動窗口類問題是面試當(dāng)中的高頻題,問題本身其實(shí)并不復(fù)雜压状,但是實(shí)現(xiàn)起來細(xì)節(jié)思考非常的多仆抵,想著想著可能因?yàn)樽兞孔?..
    知止9528閱讀 648評論 0 0
  • 先給出labuladong框架 下面有幾道典型的窗口題,前面幾道是很容易套這個模板的种冬。但是后面的兩道:求和和求乘積...
    奧爾良雞腿腿閱讀 310評論 0 0
  • 一 滑動窗口 滑動窗口法(sliding window)常用于輸入為數(shù)組镣丑,輸出為統(tǒng)計(jì)滿足特定約束條件的子串次數(shù)的情...
    周恩國的學(xué)習(xí)筆記閱讀 2,741評論 0 0
  • 滑動窗口算法思想是非常重要的一種思想,可以用來解決數(shù)組娱两,字符串的子元素問題莺匠。它可以將嵌套循環(huán)的問題,轉(zhuǎn)換為單層循環(huán)...
    程序員will閱讀 1,802評論 0 1