【问题描述】[第76题][最小覆盖子串][中等]
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
【解答思路】
1. 滑动窗口 map
时间复杂度:O(N^2) 空间复杂度:O(1)
class Solution {public String minWindow(String s, String t) {if (s == null || t == null || s.length() == 0 || t.length() == 0) return "";// 定义一个数字,用来记录字符串 t 中出现字符的频率,也就是窗口内需要匹配的字符和相应的频率int[] map = new int[128];for (char c : t.toCharArray()) {map[c]++;}int left = 0, right = 0;int match = 0; // 匹配字符的个数int minLen = s.length() + 1; // 最大的子串的长度// 子串的起始位置 子串结束的位置(如果不存在这样的子串的话,start,end 都是 0,s.substring 截取就是 “”int start = 0, end = 0;while (right < s.length()){char charRight = s.charAt(right); // 右边界的那个字符map[charRight]--; // 可以理解为需要匹配的字符 charRight 减少了一个// 如果字符 charRight 在 t 中存在,那么经过这一次操作,只要个数大于等于 0,说明匹配了一个// 若字符 charRight 不在 t 中,那么 map[charRight] < 0, 不进行任何操作if (map[charRight] >= 0) match++;right++; // 右边界右移,这样下面就变成了 [),方便计算窗口大小// 只要窗口内匹配的字符达到了要求,右边界固定,左边界收缩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 中出现的字符,移出窗口,最终能够达到的最大值 map[charLeft] = 0// 如果恰好移出了需要匹配的一个字符,那么这里 map[charLeft] > 0, 也就是还要匹配字符 charLeft,此时 match--if (map[charLeft] > 0) match--;left++; // 左边界收缩}}return s.substring(start, end);}
}
2. 互动窗口 汉明距离
时间复杂度:O(N) 空间复杂度:O(1)
【总结】
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++;// 进行窗口内数据的一系列更新.../*** debug 输出的位置 ***/printf("window: [%d, %d)\n", left, right);/********************/// 判断左侧窗口是否要收缩while (window needs shrink) {// d 是将移出窗口的字符char d = s[left];// 左移窗口left++;// 进行窗口内数据的一系列更新...}}
}
2.滑动窗口 end指针向右移动, start向左移动 细节多多
3.细节
// 分类·
int[] map = new int[128];for (char c : t.toCharArray()) {map[c]++;}
转载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-/