leetcode76–最小覆盖子串
题目描述
题目链接:leetcode76
解题思路–滑动窗口
对于本题,首先可以根据题目描述是属于滑动窗口解法,和leetcode的第三题比较像,对于滑动窗口解法,首先我们需要定义左节点,右节点,窗口长度,剩下的就是中间的判别过程了。对于本题,给定了总字符串长度s,以及目标字符串长度t。寻找s中覆盖t的最小子串。如果不存在则返回空字符串,所有这是一道有返回值的题目,返回值类型为String,所以我们定义一个res作为返回值,默认值就为“”。首先我们先遍历一下目标字符串t,将目标字符串中的所有的数值以及出现的次数存储进入map集合中。在遍历了目标字符串t之后,我们先进行右节点进行遍历,在左节点小于总长度的前提下,右节点不断的向右移动。接着判断s.charAt(right)是否是字符串t中的字符,每发现t中的一个字符,相应的HashMap中的值就需要减1。如果在HashMap中s.charAt(right)所对应的字符的数量大于0,则说明t中的该字符还有剩余数量,并没有完全被s中[left, right]范围的字符串所包含,此时需要count++,同时HashMap中对应的键的值需要-1。如果在HashMap中s.charAt(right)所对应的字符的数量已经小于等于0了,那么说明s中[left, right]范围的字符串包含了超出t中所包含个数的相应字符,此时count不应该+1,但是HashMap中对应的键的值仍然需要-1,表示s中[left, right]范围的字符串包含了富余的相应字符。如果count >= t.length()则说明s中[left, right]范围的字符串已经包含了t中所有字母。left指针需要向右移动。在左指针向左移动的过程中,我们需要先判断一下当前字符串在左指针所指向的位置对应的数是否存在于hashmap中,如果存在那么也需要判断一下当前左指针所对应的值是否为0,如果等于0,则说明s中[left, right]范围的字符串所包含该字符的数量与t中所包含的数量相等,left右移缺失这个字符后,s中[left, right]范围的字符串所包含的t中的字符的数量会减少1,需要count–,同时相应的HashMap中的值需要+1。如果HashMap中所对应的字符的数量小于0,表示s中[left, right]范围的字符串包含了富余的相应字符,此时left右移缺失的这个字符不会导致count–,只需要HashMap中相应的值+1即可。
代码
class Solution {
public String minWindow(String s, String t) {
HashMap<Character,Integer> hashMap = new HashMap<>();
for (int i = 0; i < t.length(); i++) {
if(hashMap.containsKey(t.charAt(i))){
hashMap.put(t.charAt(i),hashMap.get(t.charAt(i))+1);
}else {
hashMap.put(t.charAt(i),1);
}
}
// System.out.println(hashMap);
int left = 0;
int right = -1;
int count = 0;
String res = "";
int len = s.length() + 1;
while (left < s.length()){
if (right+1 < s.length() && count<t.length()){
right ++ ;
if (hashMap.containsKey(s.charAt(right))){
if (hashMap.get(s.charAt(right))>0){
count ++;
}
hashMap.put(s.charAt(right),hashMap.get(s.charAt(right))-1);
}
}
else {
if (hashMap.containsKey(s.charAt(left))){
if(hashMap.get(s.charAt(left)) == 0){
count --;
}
hashMap.put(s.charAt(left),hashMap.get(s.charAt(left))+1);
}
left ++;
}
if(count == t.length()){
if(right - left + 1 < len){
len = right - left + 1;
res = s.substring(left,right+1);
}
}
}
// System.out.println(res);
return res;
}
}
参考
https://blog.csdn.net/qq_41231926/article/details/81427851