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