q:給你乙個字串 s、乙個字串 t,請在字串 s 裡面找出:包含 t 所有字母的最小子串。
示例:輸入: s = "adobecodebanc", t = "abc"
輸出: "banc"
說明:如果 s 中不存這樣的子串,則返回空字串 ""。
如果 s 中存在這樣的子串,我們保證它是唯一的答案。
a:引用:《labuladong的演算法小抄》
使用滑動視窗。滑動窗⼝演算法的思路是這樣:
1、我們在字串 s 中使⽤雙指標中的左右指標技巧,初始化 left = right =0,把索引閉區間 [left, right] 稱為⼀個「窗⼝」。
2、我們先不斷地增加 right 指標擴⼤窗⼝ [left, right],直到窗⼝中的字串符合要求(包含了 t 中的所有字元)。
3、此時,我們停⽌增加 right,轉⽽不斷增加 left 指標縮⼩窗⼝ [left,right],直到窗⼝中的字串不再符合要求(不包含 t 中的所有字元了)。同時,每次增加 left,我們都要更新⼀輪結果。
4、重複第 2 和第 3 步,直到 right 到達字串 s 的盡頭。
下⾯畫圖理解⼀下,needs 和 window 相當於計數器,分別記錄 t 中字元出現次數和窗⼝中的相應字元的出現次數。
初始狀態:
增加 right,直到窗⼝ [left, right] 包含了 t 中所有字元:
現在開始增加 left,縮⼩窗⼝ [left, right]。
直到窗⼝中的字串不再符合要求,left 不再繼續移動。
之後重複上述過程,先移動 right,再移動 left…… 直到 right 指標到達字串 s 的末端,演算法結束。
**:
public string minwindow(string s, string t)
int match = 0;
while (right < s.length()) else
if (window.get(now).equals(need.get(now)))
}//window中的字串符合need的要求了
while (match == need.size())
char temp = s.charat(left);
if (window.containskey(temp))
}left++;
}right++;
}return minlen == integer.max_value ? "" : s.substring(start, start + minlen);
}
最小覆蓋子串
給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。滑動視窗。設定left,right兩個游標...
最小覆蓋子串
描述 給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。實現 class solution ...
最小覆蓋子串
題目 給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。思路 參考大佬的解題思路,超級清晰 ...