LeetCode 热题100-32-最小覆盖字串

核心思路:滑动窗口
内容:
主要分为三个步骤:
1.窗口右端不断增大,直至到达字符串s末尾;
2.不断增大窗口左端,因为要求是包含字符串t的最小字符串,所以要将不必要的元素排除在外,直至一个包含其最小的字符串为止;
3.让左端窗口增加一个位置,这样条件不满足,回到步骤1去执行,直至右端窗口到达字符串s的右边界。
如何判断包含了t所有的字符?
答:创建一个need字段,初始为t的长度,全部包含时为0。

class Solution {
    public String minWindow(String s, String t) {
        int[] sign = new int[128];
        for(int i = 0; i < t.length(); i++){
            sign[t.charAt(i)]++;
        }
        int left = 0,right = 0;
        int len = s.length();
        int need = t.length();
        int count = 100000;
        String s1 = new String();
        String s2 = new String();
        while(right < len){
        	//只有字符串t中的字符是>0的
            if(sign[s.charAt(right)] > 0){
                need--;
            }
            sign[s.charAt(right)]--;
            if(need == 0){
            	//只有非t的字符才是<0的,t的字符是正好等于0的
                while(sign[s.charAt(left)] < 0){
                    sign[s.charAt(left)]++;
                    left++;
                }
                s1 = s.substring(left,right + 1);
                if(s1.length() < count){
                    count = s1.length();
                    s2 = s1;
                }
                sign[s.charAt(left)]++;
                left++;
                need++;
            }
            right++;
        }
        return s2;
    }
}

小技巧:利用int数组统计字符char数量(为什么是128?A-Z的整型值是65-90,a-z的整型值是97-122)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值