【问题描述】[第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-/

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

  1. LeetCode 76. 最小覆盖子串 (滑动窗口哈希表)

    LeetCode 76. 最小覆盖子串 思路: 准备一个map1记录字符串t(字符, 字符个数) 准备一个map2记录在s的窗口中所包含的t串字符(字符,字符个数) 左端点收缩条件:窗口内已经覆盖了t ...

  2. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  3. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  4. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  5. cstring判断是否包含子串_最长子串-滑动窗口

    接下来我会找出LeetCode中一些比较有代表性的题,带来它的算法和讲解 很多题目,使用一般的暴力算法很多都能解出来,但时间复杂度可能是 O(n3),会比最优解慢很多,尤其是数据量变大时. 在我们实际 ...

  6. [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]

    [问题描述][中等] 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0.示例: 输入: ...

  7. JAVA窗口sin值_大厂经典笔试题—LeetCode03无重复字符的最长子串(滑动窗口)

    题目描述 原创作者:bigsai,长期维护不易,如有收获还请点赞.收藏支持! 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabc ...

  8. Leetcode刷题100天—3. 无重复字符的最长子串(滑动窗口+集合+双指针)—day21

    前言: 作者:神的孩子在歌唱 大家好,我叫运智 3. 无重复字符的最长子串 难度中等6009收藏分享切换为英文接收动态反馈 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 ...

  9. [Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]

    [问题描述][中等] 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度.示例 1:输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度 ...

最新文章

  1. 通用权限管理系统组件 给信息管理系统加一个初始化的功能,调用存储过程
  2. JavaScript———从setTimeout与setInterval到AJAX异步
  3. python运用范围_如何在python中使用某个范围对数字列表进行分组?
  4. oracle只读事物,oracle的只读事务
  5. Qt工作笔记-QSS中关于QScrollBar的设置
  6. 别人家的公司!雷军发红包 人均39万
  7. 记一次Jenkins 打包异常 ERROR: Exception when publishing, exception message [Failure]
  8. 时间复杂度(3):排序算法的时间复杂度 空间复杂度 总结
  9. Unity3D开发电脑选择
  10. visio 2003 怎么样画括号
  11. Hive中除了窗口函数外的常用函数:casewhen,行转列,列转行
  12. 手机上最好用的五笔输入法_什么手机输入法最实用?目前最受欢迎的3款盘点,你正在用哪款呢...
  13. 一周技术学习笔记(第58期)-如何突破第四章障碍
  14. android studio + ndk + cmake + jna +sqlite c层报错SQLITE_CANTOPEN(14),SQLITE_MISUSE(21)问题
  15. CodeForces - 1526C2
  16. 成功焊接BGA芯片技巧
  17. 金三银四春招特供|高质量面试攻略
  18. 数据分析 深入挖掘QQ空间的商业价值
  19. iReader Smart X 连接USB不显示
  20. android adb没反应,Android adb无法发现设备处理方法

热门文章

  1. iOS手势UIGustureRecognizer
  2. windows设备坐标和逻辑坐标的转换
  3. 几个简单的正则小例子
  4. One2One主键关联的实现
  5. 华为android9.0升级,华为官方更新消息:这几款手机9月5日分批推送安卓9.0系统升级...
  6. Jmeter使用流程及简单分析监控
  7. Alibaba Druid连接池接入
  8. c#语言中的变量名,在C#中创建动态变量名
  9. 简单快速的用SpringBoot访问静态资源(图片、html)
  10. svn redis和rabbitmq服务启动