LeetCode-076-最小覆盖子串

本文介绍了一种使用滑动窗口的方法来解决LeetCode上的第076题——最小覆盖子串的问题。通过两个指针定义窗口范围,首先利用右指针扩大窗口直至满足条件,再用左指针缩小窗口来寻找最短符合条件的子串。

LeetCode-076-最小覆盖子串

在这里插入图片描述

思路

使用滑动窗口解决该问题

这里简单地介绍一下什么叫做滑动窗口理论
就是用一个可以滑动的窗口,该窗口有2个指针,来表示窗口范围,然后先用右指针来满足条件,然后用左指针来缩小答案范围。

代码

class Solution {
      public String minWindow(String s, String t) {
       String res="";
       int len1=s.length(),len2=t.length();
       //conut表示当前覆盖的子串长度,min表示最小长度
       int left=0,right=0,count=0,min=Integer.MAX_VALUE;
       //滑动窗口数组用于记录当前子串字母个数
       int []wins=new int[128];
       //need数组记录所需子串字母个数
       int []need=new int[128];
       for(int i=0;i<len2;i++){
           need[t.charAt(i)]++;
       }
       while(right<len1){
           char ch1=s.charAt(right);
           wins[ch1]++;
           if(need[ch1]>0&&wins[ch1]<=need[ch1]) count++;
           
           //找到覆盖子串
           while(count==len2){
                if((right-left+1) < min) {
                    min=right-left+1;
                    res=s.substring(left, right+1);
                }
               //尝试缩短
               char ch2=s.charAt(left);
               if(wins[ch2]>0&&wins[ch2]<=need[ch2]) count--;

               wins[ch2]--;
               left++;
           }
           right++;
       }
       return res;

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值