LeetCode 76 最小覆蓋子串

2022-07-10 17:21:14 字數 1027 閱讀 1755

acwing

暴力做法

問題的思考方式都是從暴力解法開始,然後再看看有沒有什麼性質可以利用來優化求解過程。這題很容易想到是兩個問題的結合:列舉\(t\)的全排列以及匹配子串行。時間複雜度全排列是\(o(n!)\)的,是鐵定會超時的。

滑動視窗(雙指標)

當答案滿足單調性時,就可以使用雙指標演算法。這題的單調性如下圖所示,i右走,j不會左走.

接下來乙個問題,就是如何去獲取t的某個排列是不是當前視窗的乙個子串行。這裡用的是雜湊表。雜湊表使得我們把用作比較的物件,不再是作為乙個整體的字串,而是乙個個分散的字元,雜湊表儲存字元的數目,我們只要也統計當前視窗字元的數目,比較它們的數目即可。

接下來引入有效的概念,在統計的過程中,我們不是要做視窗每動一次就要遍歷一遍統計各個字元數目。統計的過程和尋找答案的過程是相伴的。另外,比較兩個雜湊表之間是否相等,也不用線性遍歷一下他們,我們可以使用cnt來統計當前視窗裡真正有效的字元數量。視窗的雜湊表各個字元的數目隨著視窗變化也在變化,在變化的過程中一旦到了滿足t的雜湊表的時候,接下來的字元就不用再統計了,因為他們都是多餘的了,也就是無效的。

保證了視窗雜湊表存放的都是有效字元的數目,那麼我們可以直接通過雜湊表內的字元數目總值和t的長度來比較。

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,然後...