LeetCode 76 最小覆蓋子串

2021-10-08 18:49:14 字數 1493 閱讀 7102

給你乙個字串 s、乙個字串 t,請在字串 s 裡面找出:包含 t 所有字元的最小子串。

示例:

輸入: s = 「adobecodebanc」, t = 「abc」

輸出: 「banc」

說明:

如果 s 中不存這樣的子串,則返回空字串 「」。

如果 s 中存在這樣的子串,我們保證它是唯一的答案。

參考【演算法基礎課】最長連續不重複子串。

分成幾個子問題:

(1)如何檢測字串a包含字串b的全部內容?

首先,字串b中的字母可以重複。其次,a中包含b中的所有字元,無需考慮順序。所以,可以把b中的每個不重複字元的個數儲存到b_map中,把a中對應字元的個數也存起來到a_map。只要a_map中的每個字元的個數都大於等於b_map的字元個數即可。

(2)如何在字串s中滑動視窗?

a. 將end的指標向後移動,直到從0到end的子字串符合條件。

b. 將start指標從0開始向後移一位,如果此時的子字串不符合條件了,那就繼續移動end指標,直到符合條件。

為什麼要這樣做呢?因為如果不把start指標向後移動,end向後移,得到的子字串只會更大。而移動一位之後長度可能減一。

c.當再次得到符合條件的字串時,就繼續向後移動start指標直到不滿足條件,此時得到的一定是最短的字串了。

class

solution

return

true

;}

string minwindow

(string s, string t)

for(

int i=

0,j=

0;isize()

;i++

)while

(checkcontainall()

)if(t_mp.

find

(s[j]

)!=t_mp.

end())

j++;}

}if(a!=-1

)else

return"";

}};

for迴圈的簡寫方式:

(1)string

for

(const

auto

&c:t)

(2)map

for

(const

auto

&p:t_mp)

檢測雜湊表中是否存在某個值

t_mp.

find

(s[j]

)!=t_mp.

end(

)//存在則為true

LeetCode76 最小覆蓋子串

給定乙個字串 s 和乙個字串 t,請在 s 中找出包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 字串和雜湊表的問題。hashmap來儲存t字串中個字母元素的出現次數,left right記錄當前子字串的左右下標值,min minleft ...

leetcode 76 最小覆蓋子串

這道題我使用了很笨的方式花了好久解決了,但是時間複雜度太度,只看網上檢視原始碼,不得不說網上的答案基本都是一樣的,但是對於基礎相對薄弱的我來說這些 看起來很是費勁,還用要加強c 基礎的練習才行。思路相對來說不是很難 1 首先構架t字串的hash表,因為字元與ascii碼較好的關係,使用vector陣...

leetcode76 最小覆蓋子串

給定乙個字串 s 和乙個字串 t,請在 s 中找出包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。典型雙指標滑動串列埠題目,先將t建dict,然後...