Sliding Window - 76. Minimum Window Substring
时间:2022-07-25
本文章向大家介绍Sliding Window - 76. Minimum Window Substring,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
76. Minimum Window Substring
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
Example:
Input: S = "ADOBECODEBANC", T = "ABC" Output: "BANC"
Note:
- If there is no such window in S that covers all characters in T, return the empty string
""
. - If there is such window, you are guaranteed that there will always be only one unique minimum window in S.
思路:
这是一道经典的sliding window的题目,题目意思是给定两个字符串,字符串
S
如果包含另一个字符串T
的所有字符,那么就返回这个包含T
所有字符的最小字符串。做法是使用two points,来找到合法的子串,然后从左边不断收缩合法字串的大小,直到合法性消失之后,快指针继续往后探索寻找合法子串。因为字符串中只包含字符,所以可以把map改用256位的数组来记录t中的字符。
代码:
java:
class Solution {
/* public String minWindow(String s, String t) {
// corner case
if (s.length() < t.length()) return "";
// gen string t map
Map<Character, Integer> wordDict = new HashMap<>();
for (char c : t.toCharArray()){
Integer count = wordDict.get(c);
if (count == null) {
wordDict.put(c, 1);
} else {
wordDict.put(c, count+1);
}
}
int slow = 0, minLen = Integer.MAX_VALUE, matchCount = 0, index = 0;
for (int fast = 0; fast < s.length(); fast++) {
char c = s.charAt(fast);
Integer count = wordDict.get(c);
if (count == null) continue;
wordDict.put(c, count-1);
// macth another character
if (count == 1) matchCount++; // 如果count减少,就说明找到一个匹配的字符。
// 如果发现找到了t中所有的字符,就开始逐步从子串最左边开始往右移动,缩短匹配字符串的长度。
while (matchCount == wordDict.size()) {
// find a valid substring
if (fast - slow + 1 < minLen) {
minLen = fast - slow + 1;
index = slow;
}
char leftmost = s.charAt(slow++);
Integer leftmostCount = wordDict.get(leftmost);
if (leftmostCount == null) continue; // 如果是t中没有的字符就不管
// 如果找t中有的字符,就把map中的值加一
wordDict.put(leftmost, leftmostCount + 1);
if (leftmostCount == 0) matchCount--; // 0->1
}
}
return minLen == Integer.MAX_VALUE ? "" : s.substring(index, index + minLen);
}*/
public String minWindow(String s, String t) {
// corner case
if (s.length() < t.length()) return "";
// gen string t map
int[] wordDict = new int[256];
for (char c : t.toCharArray()) wordDict[c]++;
int slow = 0, minLen = Integer.MAX_VALUE, matchCount = t.length(), index = 0;
for (int fast = 0; fast < s.length(); fast++) {
char c = s.charAt(fast);
// 在数组中发现一位大于0,就说明找到了一个t中的字符,matchCount减一
if (wordDict[c] > 0) matchCount--;
// 如果不是t中的字符就把数组中的数组减一
wordDict[c]--;
// 如果发现找到了t中所有的字符,就开始逐步从子串最左边开始往右移动,缩短匹配字符串的长度。
while (matchCount == 0) {
// find a valid substring
if (fast - slow + 1 < minLen) {
minLen = fast - slow + 1;
index = slow;
}
// 逐步从子串最左边开始往右移动,缩短匹配字符串的长度。
char leftmost = s.charAt(slow++);
// 然后把数组的c增加,如果发现增加之后大于0,说明又找到一个t满足的字符
wordDict[leftmost]++;
if (wordDict[leftmost] > 0) matchCount++;
}
}
return minLen == Integer.MAX_VALUE ? "" : s.substring(index, index + minLen);
}
}
- 360春秋杯3道web题的简单分析
- Vue 2.0 学习总结,精华全在这里了
- 25.2 安装Docker
- 使用JDBC向Kudu表插入中文字符-cast的秘密
- 使用JDBC向Kudu表插入中文字符-双引号的秘密
- Yarn的JobHistory目录权限问题导致MapReduce作业异常
- 输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止
- Linux基础(day76)
- zabbix设置QQ邮箱告警
- 关于JSON CSRF的一些思考
- linux学习第七十篇:expect脚本同步文件,expect脚本指定host和要同步的文件,构建文件分发系统,批量远程执行命令
- linux学习第六十九篇:分发系统介绍,expect脚本远程登录,expect脚本远程执行命令,expect脚本传递参数
- linux学习第六十八篇:告警系统邮件引擎,运行告警系统
- linux学习第六十七篇:告警系统主脚本,告警系统配置文件,告警系统监控项目
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Python基础】一文看懂 Pandas 中的透视表
- 彻底干掉恶心的 SQL 注入漏洞, 一网打尽!
- 某小型公司持续集成工具 Jenkins 实践
- 使用RBAC Impersonation简化Kubernetes资源访问控制
- 求求你别再用 MySQL offset 和 limit 分页了?
- 短视频带货源码,获取购物车中所有商品列表并加载显示
- 【Flutter 实战】菜单(Menu)功能
- 【Flutter 实战】路由堆栈详解
- 【Flutter 实战】全局监听路由堆栈变化
- 数据挖掘从入门到放弃:线性回归和逻辑回归
- 【Flutter 实战】文件系统目录
- 【原创】Spring Boot终极篇《上》
- 【原创】Spring Boot终极篇《下》
- 面试官:JDK、JRE、JVM 三者什么关系?
- 面试官:什么是面向对象?