LeetCode第七天之最小覆盖字串76

在这里插入图片描述

滑动窗口之加法

public static String minWindow(String s, String t) {
        int sLen=s.length();
        int tLen=t.length();
        //处理特殊情况
        if (sLen==0||tLen==0||sLen<tLen)
            return "";

        char[] charArrayS=s.toCharArray();
        char[] charArrayT=t.toCharArray();

        //ascii('z')=122
        int[] winFreq=new int[128];
        int[] tFreq=new int[128];
        for (char c: charArrayT){
            tFreq[c]++;
        }
        //滑动窗口内部包含多少T中的字符,对应字符频数超过不重复计算
        int distance=0;
        //最小覆盖字串的长度
        int minLen=sLen+1;
        //对应起始位置的下标
        int begin=0;
        //左边界、右边界
        int left=0;
        int right=0;
        //[left,right)
        while(right<sLen){
            //s字符串中第right个元素在t中没有,右边界往后移动
            if(tFreq[charArrayS[right]]==0){
                right++;
                continue;
            }
            //维护distance
            if (winFreq[charArrayS[right]]<tFreq[charArrayS[right]]){
                distance++;
            }
            winFreq[charArrayS[right]]++;
            right++;

            //滑动窗口内部元素包含了t中所有元素
            //此时左边界开始向右移动
            while (distance==tLen){

                //维护最小覆盖字串的长度和起始位置下标
                if (right-left<minLen){
                    minLen=right-left;
                    begin=left;
                }
                //左边界中s字符串第left在t中没有,左边界右移
                if (tFreq[charArrayS[left]]==0){
                    left++;
                    continue;
                }
                //左边界右移前判断 左边界中s字符串第left在t中个数,如果等于刚好等于窗口中的个数,此时要结束while
                if (winFreq[charArrayS[left]]==tFreq[charArrayS[left]]){
                    distance--;
                }
                //左边界右移
                winFreq[charArrayS[left]]--;
                left++;
            }
        }
        //没有更新最小覆盖字串
        if (minLen==sLen+1){
            return "";
        }
        return s.substring(begin,begin+minLen);
    }

在这里插入图片描述

滑动窗口之减法

public static String minWindow(String s, String t) {
        int sLen=s.length();
        int tLen=t.length();
        //处理特殊情况
        if (sLen==0||tLen==0||sLen<tLen)
            return "";

        char[] charArrayS=s.toCharArray();
        char[] charArrayT=t.toCharArray();

        //ascii('z')=122
        int[] tFreq=new int[128];
        for (char c: charArrayT){
            tFreq[c]++;
        }
        //滑动窗口内部还差多少T中的字符,对应字符频数超过不重复计算
        int distance=tLen;
        //最小覆盖字串的长度
        int minLen=sLen+1;
        //对应起始位置的下标
        int begin=0;
        //左边界、右边界
        int left=0;
        int right=0;
        //[left,right)
        while(right<sLen){
            //维护distance
            if (tFreq[charArrayS[right]]>0){
                distance--;
            }
            tFreq[charArrayS[right]]--;
            right++;
            //滑动窗口内部元素包含了t中所有元素
            //此时左边界开始向右移动
            while (distance==0){

                //维护最小覆盖字串的长度和起始位置下标
                if (right-left<minLen){
                    minLen=right-left;
                    begin=left;
                }
                //左边界移除之后,需要出现的字符个数
                if (tFreq[charArrayS[left]]==0){
                    distance++;
                }
                //左边界右移
                tFreq[charArrayS[left]]++;
                left++;
            }
        }
        //没有更新最小覆盖字串
        if (minLen==sLen+1){
            return "";
        }
        return s.substring(begin,begin+minLen);
    }

在这里插入图片描述

学以致用

滑动窗口的模板!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值