最小覆盖子串(滑动窗口)
- 题目来源:[力扣](https://leetcode-cn.com/problems/minimum-window-substring/)
- 题解思路
- 一、Java中map.getOrDefault()方法的使用
- 二、代码块
- 三、运行结果
- 总结
题目来源:力扣
1.题目
2.示例
3.范围
题解思路
时间复杂度:(滑动窗口) O(n)
1.首要条件:我们需要两个哈希表,hs哈希表维护的是s字符串中滑动窗口中各个字符出现多少次,ht哈希表维护的是t字符串各个字符出现多少次。
2.设置两个指针left和right都从0开始向右边滑动,始终满住left<right。
3.如果hs哈希表中包含ht哈希表中的所有字符,并且对应的个数都不小于ht哈希表中各个字符的个数,那么说明当前的窗口是可行的,可行中的长度最短的滑动窗口就是答案。
详细解释请看代码块的注释,会比较形象
一、Java中map.getOrDefault()方法的使用
在看代码块之前。我建议大家先明白这个函数的作用:
本题题解就是运用到此函数
Map.getOrDefault(Object key, V defaultValue)方法的作用是:
当Map集合中有这个key时,就使用这个key值;
如果没有就使用默认值defaultValue。
二、代码块
在IDEA运行的完整代码模块,以便于自己进行Debug和示例添加。
代码如下(示例):
import java.util.HashMap;
import java.util.Map;
/**
* 一些声明信息
* Description:
* date: 2022/4/4 21:05
* @author Haier
* @version 1.0
* @since JDK 1.8
*/
public class Main {
public static void main(String[] args) {
Solution solution=new Solution();
String s="ADOBECODEBANC";
String t="ABC";
System.out.println(solution.minWindow(s,t));
}
}
class Solution {
public String minWindow(String s, String t) {
//维护s串中滑动窗口中各个字符出现次数
Map<Character,Integer> hs=new HashMap<>();
//维护t串中各个字符出现次数
Map<Character,Integer> ht=new HashMap<>();
//理解hashmap.getOrDefault()的详细用法 超级实用 特别是对出现的次数进行计数!!
for (int i = 0; i < t.length(); i++) {
ht.put(t.charAt(i),ht.getOrDefault(t.charAt(i),0)+1);
}
//设置结果字符串为空
String str="";
//设置结果字符串的默认长度 为最大
int len=Integer.MAX_VALUE;
//记录t出现的字符次数
int acount=0;
//
for (int left=0,right=0; right < s.length(); right++) {
//1。记录s的字符
hs.put(s.charAt(right),hs.getOrDefault(s.charAt(right),0)+1);
//2.判断是否 窗口右边出现t中的字符
if (ht.containsKey(s.charAt(right))){
//如果出现 并且hs表中的字符个数<=ht表中的字符个数,说明该字符是必须的,并且还未到达字符串t所要求的数量
if(hs.get(s.charAt(right))<=ht.get(s.charAt(right))){
acount++;
}
}
//没有出现t中的字符 --->开始收缩滑动窗口
//3.判断 (如果左边界的值不在ht表中 或者 它在hs表中的出现次数多于ht表中的出现次数) 则往窗口左边往-->右边收缩
while (left<right&&(!ht.containsKey(s.charAt(left))||hs.get(s.charAt(left))>ht.get(s.charAt(left)))){
hs.put(s.charAt(left),hs.get(s.charAt(left))-1);
left++;
}
//4. 如果 此时滑动窗口包含符串 t 的全部字符 并且长度比之前的短
if (acount==t.length()&&right-left+1<len){
//获取此时字符串的长度 记得+1
len=right-left+1;
//
str=s.substring(left,right+1);
}
}
return str;
}
}
三、运行结果
1.IDEA
2.力扣
总结
基于本题,我们需要掌握的有:滑动窗口思想、hashmap的实用函数(getOrDefault)