国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

leetcode76. 最小覆蓋子串(滑動窗口-java)

這篇具有很好參考價值的文章主要介紹了leetcode76. 最小覆蓋子串(滑動窗口-java)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

最小覆蓋子串

難度 - 困難
原題鏈接 - 最小覆蓋字串

給你一個字符串 s 、一個字符串 t 。返回 s 中涵蓋 t 所有字符的最小子串。如果 s 中不存在涵蓋 t 所有字符的子串,則返回空字符串 “” 。
注意:
對于 t 中重復(fù)字符,我們尋找的子字符串中該字符數(shù)量必須不少于 t 中該字符數(shù)量。
如果 s 中存在這樣的子串,我們保證它是唯一的答案。

示例 1:
輸入:s = “ADOBECODEBANC”, t = “ABC”
輸出:“BANC”
解釋:最小覆蓋子串 “BANC” 包含來自字符串 t 的 ‘A’、‘B’ 和 ‘C’。

示例 2:
輸入:s = “a”, t = “a”
輸出:“a”
解釋:整個字符串 s 是最小覆蓋子串。

示例 3:
輸入: s = “a”, t = “aa”
輸出: “”
解釋: t 中兩個字符 ‘a(chǎn)’ 均應(yīng)包含在 s 的子串中,
因此沒有符合條件的子字符串,返回空字符串。

提示:
m == s.length
n == t.length
1 <= m, n <= 1e5
s 和 t 由英文字母組成
leetcode76. 最小覆蓋子串(滑動窗口-java),算法,數(shù)據(jù)結(jié)構(gòu),java,java,python,開發(fā)語言,算法,leetcode,數(shù)據(jù)結(jié)構(gòu)

滑動窗口

這個算法技巧的思路非常簡單,就是維護(hù)一個窗口,不斷滑動,然后更新答案么.
該算法的大致邏輯如下:

int left = 0, right = 0;

while (left < right && right < s.size()) {
    // 增大窗口
    window.add(s[right]);
    right++;
    
    while (window needs shrink) {
        // 縮小窗口
        window.remove(s[left]);
        left++;
    }
}

這個算法技巧的時間復(fù)雜度是 O(N),比字符串暴力算法要高效得多。

本題的解題思路:
1、我們在字符串 S 中使用雙指針中的左右指針技巧,初始化 left = right = 0,把索引左閉右開區(qū)間 [left, right) 稱為一個「窗口」。
理論上你可以設(shè)計兩端都開或者兩端都閉的區(qū)間,但設(shè)計為左閉右開區(qū)間是最方便處理的。因?yàn)檫@樣初始化 left = right = 0 時區(qū)間 [0, 0) 中沒有元素,但只要讓 right 向右移動(擴(kuò)大)一位,區(qū)間 [0, 1) 就包含一個元素 0 了。如果你設(shè)置為兩端都開的區(qū)間,那么讓 right 向右移動一位后開區(qū)間 (0, 1) 仍然沒有元素;如果你設(shè)置為兩端都閉的區(qū)間,那么初始區(qū)間 [0, 0] 就包含了一個元素。這兩種情況都會給邊界處理帶來不必要的麻煩。

2、我們先不斷地增加 right 指針擴(kuò)大窗口 [left, right),直到窗口中的字符串符合要求(包含了 T 中的所有字符)。

3、此時,我們停止增加 right,轉(zhuǎn)而不斷增加 left 指針縮小窗口 [left, right),直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。同時,每次增加 left,我們都要更新一輪結(jié)果。

4、重復(fù)第 2 和第 3 步,直到 right 到達(dá)字符串 S 的盡頭。

這個思路其實(shí)也不難,第 2 步相當(dāng)于在尋找一個「可行解」,然后第 3 步在優(yōu)化這個「可行解」,最終找到最優(yōu)解,也就是最短的覆蓋子串。左右指針輪流前進(jìn),窗口大小增增減減,窗口不斷向右滑動,這就是「滑動窗口」這個名字的來歷。

下面畫圖理解一下,needs 和 window 相當(dāng)于計數(shù)器,分別記錄 T 中字符出現(xiàn)次數(shù)和「窗口」中的相應(yīng)字符的出現(xiàn)次數(shù)。

leetcode76. 最小覆蓋子串(滑動窗口-java),算法,數(shù)據(jù)結(jié)構(gòu),java,java,python,開發(fā)語言,算法,leetcode,數(shù)據(jù)結(jié)構(gòu)leetcode76. 最小覆蓋子串(滑動窗口-java),算法,數(shù)據(jù)結(jié)構(gòu),java,java,python,開發(fā)語言,算法,leetcode,數(shù)據(jù)結(jié)構(gòu)
leetcode76. 最小覆蓋子串(滑動窗口-java),算法,數(shù)據(jù)結(jié)構(gòu),java,java,python,開發(fā)語言,算法,leetcode,數(shù)據(jù)結(jié)構(gòu)
leetcode76. 最小覆蓋子串(滑動窗口-java),算法,數(shù)據(jù)結(jié)構(gòu),java,java,python,開發(fā)語言,算法,leetcode,數(shù)據(jù)結(jié)構(gòu)

代碼

public String minWindow1(String s, String t) {
        // 用于記錄需要的字符和窗口中的字符及其出現(xiàn)的次數(shù)
        Map<Character, Integer> need = new HashMap<>();
        Map<Character, Integer> window = new HashMap<>();
        // 統(tǒng)計 t 中各字符出現(xiàn)次數(shù)
        for (char c : t.toCharArray())
            need.put(c, need.getOrDefault(c, 0) + 1);

        int left = 0, right = 0;
        int valid = 0; // 窗口中滿足需要的字符個數(shù)
        // 記錄最小覆蓋子串的起始索引及長度
        int start = 0, len = Integer.MAX_VALUE;
        while (right < s.length()) {
            // c 是將移入窗口的字符
            char c = s.charAt(right);
            // 擴(kuò)大窗口
            right++;
            // 進(jìn)行窗口內(nèi)數(shù)據(jù)的一系列更新
            if (need.containsKey(c)) {
                window.put(c, window.getOrDefault(c, 0) + 1);
                if (window.get(c).equals(need.get(c)))
                    valid++; // 只有當(dāng) window[c] 和 need[c] 對應(yīng)的出現(xiàn)次數(shù)一致時,才能滿足條件,valid 才能 +1
            }

            // 判斷左側(cè)窗口是否要收縮
            while (valid == need.size()) {
                // 更新最小覆蓋子串
                if (right - left < len) {
                    start = left;
                    len = right - left;
                }
                // d 是將移出窗口的字符
                char d = s.charAt(left);
                // 縮小窗口
                left++;
                // 進(jìn)行窗口內(nèi)數(shù)據(jù)的一系列更新
                if (need.containsKey(d)) {
                    if (window.get(d).equals(need.get(d)))
                        valid--; // 只有當(dāng) window[d] 內(nèi)的出現(xiàn)次數(shù)和 need[d] 相等時,才能 -1
                    window.put(d, window.get(d) - 1);
                }
            }
        }

        // 返回最小覆蓋子串
        return len == Integer.MAX_VALUE ?
                "" : s.substring(start, start + len);
    }

上期經(jīng)典

leetcode59. 螺旋矩陣 II文章來源地址http://www.zghlxwxcb.cn/news/detail-673989.html

到了這里,關(guān)于leetcode76. 最小覆蓋子串(滑動窗口-java)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 算法leetcode|76. 最小覆蓋子串(rust重拳出擊)

    算法leetcode|76. 最小覆蓋子串(rust重拳出擊)

    給你一個字符串 s 、一個字符串 t 。返回 s 中涵蓋 t 所有字符的最小子串。如果 s 中不存在涵蓋 t 所有字符的子串,則返回空字符串 \\\"\\\" 。 注意 : 對于 t 中重復(fù)字符,我們尋找的子字符串中該字符數(shù)量必須不少于 t 中該字符數(shù)量。 如果 s 中存在這樣的子串,我們保證它是唯

    2024年02月10日
    瀏覽(24)
  • LeetCode----76. 最小覆蓋子串

    ? 題目 給你一個字符串 s 、一個字符串 t 。返回 s 中涵蓋 t 所有字符的最小子串。如果 s 中不存在涵蓋 t 所有字符的子串,則返回空字符串 “” 。 注意: 示例 1: 輸入:s = “ADOBECODEBANC”, t = “ABC” 輸出:“BANC” 解釋:最小覆蓋子串 “BANC” 包含來自字符串 t 的 ‘A’、

    2024年02月06日
    瀏覽(22)
  • leetcode做題筆記76最小覆蓋子串

    給你一個字符串? s ?、一個字符串? t ?。返回? s ?中涵蓋? t ?所有字符的最小子串。如果? s ?中不存在涵蓋? t ?所有字符的子串,則返回空字符串? \\\"\\\" ?。 注意: 對于? t ?中重復(fù)字符,我們尋找的子字符串中該字符數(shù)量必須不少于? t ?中該字符數(shù)量。 如果? s ?中存在

    2024年02月13日
    瀏覽(25)
  • 【leetcode題解C++】51.N皇后 and 76.最小覆蓋子串

    【leetcode題解C++】51.N皇后 and 76.最小覆蓋子串

    51. N皇后 按照國際象棋的規(guī)則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。 n?皇后問題 ?研究的是如何將? n ?個皇后放置在? n×n ?的棋盤上,并且使皇后彼此之間不能相互攻擊。 給你一個整數(shù)? n ?,返回所有不同的? n ? 皇后問題 ?的解決方案。 每一種

    2024年02月20日
    瀏覽(19)
  • LeetCode熱題HOT100:76. 最小覆蓋子串,84.柱狀圖中最大的矩形、96. 不同的二叉搜索樹

    LeetCode熱題HOT100:76. 最小覆蓋子串,84.柱狀圖中最大的矩形、96. 不同的二叉搜索樹

    題目 :給你一個字符串 s 、一個字符串 t 。返回 s 中涵蓋 t 所有字符的最小子串。如果 s 中不存在涵蓋 t 所有字符的子串,則返回空字符串 “” 。 注意: 對于 t 中重復(fù)字符,我們尋找的子字符串中該字符數(shù)量必須不少于 t 中該字符數(shù)量。 如果 s 中存在這樣的子串,我們保

    2023年04月19日
    瀏覽(31)
  • 【算法|滑動窗口No.1】leetcode209. 長度最小的子數(shù)組

    【算法|滑動窗口No.1】leetcode209. 長度最小的子數(shù)組

    個人主頁:兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【手撕算法系列專欄】【LeetCode】 ??本專欄旨在提高自己算法能力的同時,記錄一下自己的學(xué)習(xí)過程,希望對大家有所幫助 ??希望我們一起努力、成長,共同進(jìn)步。

    2024年02月08日
    瀏覽(25)
  • 76. 最小覆蓋子串

    76. 最小覆蓋子串 滑動窗口 兩個 Integer 相等比較應(yīng)該用 equals,而不是 ==。 一個 Integer 和一個 int 比較,Integer 會自動拆箱,可以用 ==。

    2024年02月06日
    瀏覽(56)
  • 力扣:76. 最小覆蓋子串(Python3)

    給你一個字符串? s ?、一個字符串? t ?。返回? s ?中涵蓋? t ?所有字符的最小子串。如果? s ?中不存在涵蓋? t ?所有字符的子串,則返回空字符串? \\\"\\\" ?。 注意: 對于? t ?中重復(fù)字符,我們尋找的子字符串中該字符數(shù)量必須不少于? t ?中該字符數(shù)量。 如果? s ?中存在

    2024年02月11日
    瀏覽(19)
  • 255.【華為OD機(jī)試】最小矩陣寬度(滑動窗口算法-Java&Python&C++&JS實(shí)現(xiàn))

    ??點(diǎn)擊這里可直接跳轉(zhuǎn)到本專欄,可查閱頂置最新的華為OD機(jī)試寶典~ 本專欄所有題目均包含優(yōu)質(zhì)解題思路,高質(zhì)量解題代碼(JavaPythonC++JS分別實(shí)現(xiàn)),詳細(xì)代碼講解,助你深入學(xué)習(xí),深度掌握!

    2024年03月13日
    瀏覽(23)
  • 【Leetcode刷題-Python/C++】長度最小的子數(shù)組(滑動窗口)

    209.長度最小的子數(shù)組 給定一個含有 n 個正整數(shù)的數(shù)組和一個正整數(shù) target 。 找出該數(shù)組中滿足其和 ≥ target 的長度最小的 連續(xù)子數(shù)組 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其長度。如果不存在符合條件的子數(shù)組,返回 0 。 輸入:target = 7, nums = [2,3,1,2,4,3] 輸出:2 解釋:子數(shù)

    2023年04月08日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包