lc 76 最小覆盖字串(滑动窗口方法)

数组

滑动窗口

力扣76.最小覆盖字串(困难)

题目:

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""

思路:
  1. 用哈希表记录字符串st中出现过的字符以及对应出现次数。

  2. 滑动窗口扫描字符串t,移动右边界直到满足覆盖t中所有字符的条件,开始移动左边界,更新最小的覆盖字串。循环体格式如下

    while (r < sLen) {
    	//++r不可以放在循环体末尾,这样最后一个字符无法被检查。
    	++r;
        //
        while (满足窗口条件){
            //更新
            //移动左边界
        }
        return ;
    }
    
  3. 返回结果。

注意:
  1. 指针设置。窗口的lr和最终返回值区间的ansLansR区别开,初始化代码如下。

    	//最好的窗口指针初始化。
    	int l = 0, r = -1;
    	int len = Integer.MAX_VALUE, ansL = -1, ansR = -1;
    
  2. 哈希表对Value进行+1和-1操作代码:

    //getOrDefault()方法:获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值。
    //加一
    hm.put(key, hm.getOrDefault(key, 0) + 1);
    //减一
    hm.put(key, hm.getOrDefault(key, 0) - 1);
    
  3. 哈希表check()方法:

    public boolean check() {
        //Iterator,迭代器,一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
        Iterator iter = ori.entrySet().iterator();    
        //Map的entrySet()方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键/值对。
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();   
            Character key = (Character) entry.getKey();   
            Integer val = (Integer) entry.getValue();    
            if (cnt.getOrDefault(key, 0) < val) {
                return false;
            }
        }
        return true;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值