[LeetCode]76. 最小覆盖子串(java实现)双指针
1. 题目
2. 读题(需要重点注意的东西)
思路(双指针):
用哈希表T统计字符串t
中每个字符出现的次数
用哈希表W统计滑动窗口内(j 到 i 之间)
每个字符出现的次数;
用cnt来记录字符串t
中有多少个字符在窗口中,如果cnt = t.length(),则说明窗口中包含了 字符串t 所有的字符了。
其做法与[LeetCode] 3. 无重复字符的最长子串(java实现)类似。
具体做法:
-
i 向后移动,将s.charAt(i)记录到哈希表W中;
-
判断:如果此时哈希表W中s.charAt(i)的字符个数小于字符串
t
中s.charAt(i)的字符个数:
即hash_w.get(s.charAt(i
)) < hash_t.get(s.charAt(i
)),则说明s.charAt(i)合法,cnt++; -
然后判断:hash_w.get(s.charAt(
j
)) 是否大于 hash_t.get(s.charAt(j
)),如果大于,则说明这个字符多余了,j++; -
如果cnt == t.length(),用窗口长度更新最小的最短距离res即可
代码按上述解法实现即可。
3. 解法
---------------------------------------------------解法---------------------------------------------------:
class Solution {
public String minWindow(String s, String t) {
Map<Character,Integer> hashmap_t = new HashMap<>();
Map<Character,Integer> hashmap_w = new HashMap<>();
for(var c : t.toCharArray()) hashmap_t.put(c,hashmap_t.getOrDefault(c,0)+1);
String res = "";
for(int i = 0,j = 0,cnt = 0;i < s.length();i++){
var c = s.charAt(i);
hashmap_w.put(c,hashmap_w.getOrDefault(c,0)+1);
if(hashmap_t.containsKey(c) && hashmap_w.get(c) <= hashmap_t.get(c)) cnt++;
while(j < i && (!hashmap_t.containsKey(s.charAt(j)) || hashmap_w.get(s.charAt(j)) > hashmap_t.get(s.charAt(j)))){
hashmap_w.put(s.charAt(j),hashmap_w.get(s.charAt(j))-1);
j++;
}
if(cnt == t.length()){
if(res.length() > i - j + 1 || res == ""){
res = s.substring(j,i + 1);
}
}
}
return res;
}
}
可能存在的问题: