数组
滑动窗口
力扣76.最小覆盖字串(困难)
题目:
给你一个字符串 s
、一个字符串 t
。返回 s
中涵盖 t
所有字符的最小子串。如果 s
中不存在涵盖 t
所有字符的子串,则返回空字符串 ""
。
思路:
-
用哈希表记录字符串
s
、t
中出现过的字符以及对应出现次数。 -
滑动窗口扫描字符串
t
,移动右边界直到满足覆盖t
中所有字符的条件,开始移动左边界,更新最小的覆盖字串。循环体格式如下while (r < sLen) { //++r不可以放在循环体末尾,这样最后一个字符无法被检查。 ++r; // while (满足窗口条件){ //更新 //移动左边界 } return ; }
-
返回结果。
注意:
-
指针设置。窗口的
l
、r
和最终返回值区间的ansL
、ansR
区别开,初始化代码如下。//最好的窗口指针初始化。 int l = 0, r = -1; int len = Integer.MAX_VALUE, ansL = -1, ansR = -1;
-
哈希表对Value进行+1和-1操作代码:
//getOrDefault()方法:获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值。 //加一 hm.put(key, hm.getOrDefault(key, 0) + 1); //减一 hm.put(key, hm.getOrDefault(key, 0) - 1);
-
哈希表
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; }
- Java Iterator(迭代器) | 菜鸟教程 (runoob.com)
- (以上代码来源:LeetCode-Solution)