76. 最小覆蓋子串
給你乙個字串s
、乙個字串t
。返回s
中涵蓋t
所有字元的最小子串。如果s
中不存在涵蓋t
所有字元的子串,則返回空字串""
。
注意:
示例 1:
輸入:s = "adobecodebanc", t = "abc"
輸出:"banc"
示例 2:
輸入:s = "a", t = "a"
輸出:"a"
示例 3:
輸入:s = "a", t = "aa"
輸出:""
解釋:t 中兩個字元 'a' 均應包含在 s 的子串中,
因此沒有符合條件的子字串,返回空字串。
高階:你能設計乙個在o(n)
時間內解決此問題的演算法嗎?
滑動視窗的思想:
用i
,j
表示滑動視窗的左邊界和右邊界,通過改變i
,j
來擴充套件和收縮滑動視窗,可以想象成乙個視窗在字串上游走,當這個視窗包含的元素滿足條件,即包含字串t的所有元素,記錄下這個滑動視窗的長度j-i+1
,這些長度中的最小值就是要求的結果。
步驟一不斷增加j
使滑動視窗增大,直到視窗包含了t的所有元素
步驟二不斷增加i
使滑動視窗縮小,因為是要求最小字串,所以將不必要的元素排除在外,使長度減小,直到碰到乙個必須包含的元素,這個時候不能再扔了,再扔就不滿足條件了,記錄此時滑動視窗的長度,並儲存最小值
步驟三讓i
再增加乙個位置,這個時候滑動視窗肯定不滿足條件了,那麼繼續從步驟一開始執行,尋找新的滿足條件的滑動視窗,如此反覆,直到j
超出了字串s範圍。
如何判斷滑動視窗包含了t的所有元素?
對於如何判斷滑動視窗中包含所有元素,我們可以使用乙個整數陣列,類似於以前做過的字串所有相同的字母異位詞問題和字母異位詞分組問題。
這裡可以優化的乙個地方就是,如果單純使用cnts陣列計數每個字元出現的次數,那麼在判斷的時候每次都需要判斷陣列中所有元素的數量都小於等於0時,表示當前滑動視窗不再需要任何元素。
具體地,我們可以再使用乙個計數指標cnt表示目標串中總共需要計數的字元數,並在滑動視窗的過程中維護該變數。最後,只需要判斷cnt是否為0即可。
class solution
cnts[ch]--;// 計數該字元,所需字元數量減一
if(cnt == 0)
if(r - l + 1 < minsize)
// 左指標再向右移動乙個位置,那麼視窗中肯定不滿足條件
cnts[s.charat(l)]++;
l++;
cnt++;
}r++;// 右指標右移
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,然後...