日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Leedcode][JAVA][第76题][最小覆盖子串]滑动窗口]

發(fā)布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第76题][最小覆盖子串]滑动窗口] 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【問題描述】[第76題][最小覆蓋子串][中等]

給你一個字符串 S、一個字符串 T,請在字符串 S 里面找出:包含 T 所有字符的最小子串。示例:輸入: S = "ADOBECODEBANC", T = "ABC" 輸出: "BANC" 說明:如果 S 中不存這樣的子串,則返回空字符串 ""。 如果 S 中存在這樣的子串,我們保證它是唯一的答案。

【解答思路】

1. 滑動窗口 map

時間復(fù)雜度:O(N^2) 空間復(fù)雜度:O(1)

class Solution {public String minWindow(String s, String t) {if (s == null || t == null || s.length() == 0 || t.length() == 0) return "";// 定義一個數(shù)字,用來記錄字符串 t 中出現(xiàn)字符的頻率,也就是窗口內(nèi)需要匹配的字符和相應(yīng)的頻率int[] map = new int[128];for (char c : t.toCharArray()) {map[c]++;}int left = 0, right = 0;int match = 0; // 匹配字符的個數(shù)int minLen = s.length() + 1; // 最大的子串的長度// 子串的起始位置 子串結(jié)束的位置(如果不存在這樣的子串的話,start,end 都是 0,s.substring 截取就是 “”int start = 0, end = 0;while (right < s.length()){char charRight = s.charAt(right); // 右邊界的那個字符map[charRight]--; // 可以理解為需要匹配的字符 charRight 減少了一個// 如果字符 charRight 在 t 中存在,那么經(jīng)過這一次操作,只要個數(shù)大于等于 0,說明匹配了一個// 若字符 charRight 不在 t 中,那么 map[charRight] < 0, 不進行任何操作if (map[charRight] >= 0) match++;right++; // 右邊界右移,這樣下面就變成了 [),方便計算窗口大小// 只要窗口內(nèi)匹配的字符達到了要求,右邊界固定,左邊界收縮while (match == t.length()){int size = right - left;if (size < minLen){minLen = size;start = left;end = right;}char charLeft = s.charAt(left); // 左邊的那個字符map[charLeft]++; // 左邊的字符要移出窗口// 不在 t 中出現(xiàn)的字符,移出窗口,最終能夠達到的最大值 map[charLeft] = 0// 如果恰好移出了需要匹配的一個字符,那么這里 map[charLeft] > 0, 也就是還要匹配字符 charLeft,此時 match--if (map[charLeft] > 0) match--;left++; // 左邊界收縮}}return s.substring(start, end);} }
2. 互動窗口 漢明距離


時間復(fù)雜度:O(N) 空間復(fù)雜度:O(1)


【總結(jié)】

1.滑動窗口算法模板
/* 滑動窗口算法框架 */ void slidingWindow(string s, string t) {unordered_map<char, int> need, window;for (char c : t) need[c]++;int left = 0, right = 0;int valid = 0; while (right < s.size()) {// c 是將移入窗口的字符char c = s[right];// 右移窗口right++;// 進行窗口內(nèi)數(shù)據(jù)的一系列更新.../*** debug 輸出的位置 ***/printf("window: [%d, %d)\n", left, right);/********************/// 判斷左側(cè)窗口是否要收縮while (window needs shrink) {// d 是將移出窗口的字符char d = s[left];// 左移窗口left++;// 進行窗口內(nèi)數(shù)據(jù)的一系列更新...}} }
2.滑動窗口 end指針向右移動, start向左移動 細節(jié)多多
3.細節(jié)
// 分類· int[] map = new int[128];for (char c : t.toCharArray()) {map[c]++;}

轉(zhuǎn)載https://leetcode-cn.com/problems/minimum-window-substring/solution/java-yi-ge-shu-zu-ji-lu-pin-shu-de-hua-dong-chuang/

參考鏈接:https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-tong-yong-si-xiang-by-/

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的[Leedcode][JAVA][第76题][最小覆盖子串]滑动窗口]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。