Leetcode 76 最小覆蓋子串

2021-10-06 06:29:31 字數 1340 閱讀 3025

76. 最小覆蓋子串

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

示例:

輸入: s = "adobecodebanc", t = "abc"

輸出: "banc"

說明:

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

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

拿到這道題目,先分析,從字串s中找出包含t所有字元的最小子串,意思就是如果s裡有t,那麼再從s的子串裡面找t,如果s裡面沒有t的話,那麼s的子串裡也不可能有t了。從大視窗滑到小視窗還是有點複雜的,不如反過來,由小視窗滑到大視窗來的簡單一點。從小視窗滑到大視窗的話,就是這樣的,如果小視窗內不包含t,則right++,直到視窗內包含t為止,若當right到到s的末尾還沒有,即s沒有t,則可以返回"",如果小視窗內包含t,那麼將這個視窗的子串以及該子串的長度儲存,然後left++,右移這個視窗,然後重複判斷包不包含t的這個流程,然後記錄子串的最小值以及對應的子串。

while left <= s.length() - t.length() //視窗長度小於t的長度的時候必不可能存在滿足條件的子串

1 統計每個字元出現的次數

2 子串不包含t

right還未達到s的右邊界

right++

right到達s的右邊界

break

調整子串以及各個字元出現的次數

continue

子串包含t

left++

記錄長度最小的子串和該子串的長度

調整子串以及各個字元出現的次數

總的來說核心的滑動視窗就是這樣的了

public string minwindow(string s, string t) 

sdic[s.charat(0) - 65] = 1;

int left = 0, right = 0;

int mark = 0;

int z = 0;

if (s.length() < t.length())

return "";

if (s.equals(t))

return s;

stringbuilder sb = new stringbuilder();

while (left <= s.length() - t.length())

}if (mark == 1)

} else

}return res;

}

不過在時間上,花的時間就很久,滑動策略有待優化,。。。

和鹹鹹打卡的第五天 √

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