LeetCode 最小覆蓋子串

2022-06-24 09:18:15 字數 1582 閱讀 2983

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 中存在這樣的子串,我們保證它是唯一的答案。思路 參考大佬的解題思路,超級清晰 ...