剑指 Offer II 017. 含有所有字符的最短字符串

class Solution {
    public String minWindow(String s, String t) {
        String result = s + "a";
        //左右指针
        int left = 0;
        //标志位用于标识还是有多少个字符不符合条件
        int mark = 0;
        //首先使用一个长度为256的int数组来模拟hash表表示字符串t中所有出现的字符的次数,使用数组的下标作为key用于表示出现的字符,使用数组的值作为value用于表示字符出现的次数
        int[] hash = new int[256];
        //遍历t统计各个字符的个数,并更新mark用于统计右多少个不符合条件的字符
        for(int i = 0;i < t.length();i++){
            if(++hash[t.charAt(i)] == 1){
                mark++;
            }
        }
        //遍历s
        for(int right = 0;right < s.length() || (mark == 0 && right == s.length());){
            if(mark != 0){
                //如果不是第一个字符,并且标志位不为0则,再hash中添加现在的right所在的字符,并且更新标志位
                if(--hash[s.charAt(right++)] == 0){
                    mark--;
                }
            }
            if(mark == 0){
                //如果标志位变为了0,则说明现在s的子字符串中已经存在了t中所有的字符开始执行删加字符的操作
                //现在的hash表应该是这样的,t中存在的所有字符已经为0了,t中不存在的字符现在应该时负数
                //我们右移左指针判断当前左指针的元素如果删除之后会不会使得0的位置变为负数如果会则直接退出返回结果,如果不会则直接左移
                if(right - left < result.length()){
                    result = s.substring(left,right);
                }
                hash[s.charAt(left)]++;
                if(hash[s.charAt(left++)] == 1){
                    mark++;
                }
            }
        }
        //如果s遍历结束都没有包含t中的所有字符直接返回
        return result.equals(s + "a") ? "" : result;   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值