[Leedcode][JAVA][第76题][最小覆盖子串]滑动窗口]
【问题描述】[第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题][最小覆盖子串]滑动窗口]相关推荐
- LeetCode 76. 最小覆盖子串 (滑动窗口哈希表)
LeetCode 76. 最小覆盖子串 思路: 准备一个map1记录字符串t(字符, 字符个数) 准备一个map2记录在s的窗口中所包含的t串字符(字符,字符个数) 左端点收缩条件:窗口内已经覆盖了t ...
- [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]
[问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...
- [Leedcode][JAVA][第470题][Ran7()实现Rand10()]
[问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...
- [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]
[问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...
- cstring判断是否包含子串_最长子串-滑动窗口
接下来我会找出LeetCode中一些比较有代表性的题,带来它的算法和讲解 很多题目,使用一般的暴力算法很多都能解出来,但时间复杂度可能是 O(n3),会比最优解慢很多,尤其是数据量变大时. 在我们实际 ...
- [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]
[问题描述][中等] 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0.示例: 输入: ...
- JAVA窗口sin值_大厂经典笔试题—LeetCode03无重复字符的最长子串(滑动窗口)
题目描述 原创作者:bigsai,长期维护不易,如有收获还请点赞.收藏支持! 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabc ...
- Leetcode刷题100天—3. 无重复字符的最长子串(滑动窗口+集合+双指针)—day21
前言: 作者:神的孩子在歌唱 大家好,我叫运智 3. 无重复字符的最长子串 难度中等6009收藏分享切换为英文接收动态反馈 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 ...
- [Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]
[问题描述][中等] 给两个整数数组 A 和 B ,返回两个数组中公共的.长度最长的子数组的长度.示例 1:输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度 ...
最新文章
- 通用权限管理系统组件 给信息管理系统加一个初始化的功能,调用存储过程
- JavaScript———从setTimeout与setInterval到AJAX异步
- python运用范围_如何在python中使用某个范围对数字列表进行分组?
- oracle只读事物,oracle的只读事务
- Qt工作笔记-QSS中关于QScrollBar的设置
- 别人家的公司!雷军发红包 人均39万
- 记一次Jenkins 打包异常 ERROR: Exception when publishing, exception message [Failure]
- 时间复杂度(3):排序算法的时间复杂度 空间复杂度 总结
- Unity3D开发电脑选择
- visio 2003 怎么样画括号
- Hive中除了窗口函数外的常用函数:casewhen,行转列,列转行
- 手机上最好用的五笔输入法_什么手机输入法最实用?目前最受欢迎的3款盘点,你正在用哪款呢...
- 一周技术学习笔记(第58期)-如何突破第四章障碍
- android studio + ndk + cmake + jna +sqlite c层报错SQLITE_CANTOPEN(14),SQLITE_MISUSE(21)问题
- CodeForces - 1526C2
- 成功焊接BGA芯片技巧
- 金三银四春招特供|高质量面试攻略
- 数据分析 深入挖掘QQ空间的商业价值
- iReader Smart X 连接USB不显示
- android adb没反应,Android adb无法发现设备处理方法