0
点赞
收藏
分享

微信扫一扫

Java解力扣最小覆盖子串(滑动窗口)

写心之所想 2022-04-05 阅读 45

最小覆盖子串(滑动窗口)


题目来源:力扣

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)

举报

相关推荐

0 条评论