拒绝懒惰day16
作者:互联网
终于写出来昨天的LeetCode题了:
看了题解distance实在是太妙了!
C++滑动窗口
解题思路
此处撰写解题思路
代码
class Solution {
public static String minWindow(String s, String t) {
int minL = 0, minR = s.length()+1,l = 0, r = 0, slen = s.length(), tlen = t.length(), distance=0;
Map<Character, Integer> map = new HashMap<>();
Map<Character, Integer> temp = new HashMap<>();
for (int i = 0; i < tlen; i++) {
map.put(t.charAt(i), map.getOrDefault(t.charAt(i), 0)+1);//map保存t中的词频
}
while(r < slen){
while(r<slen&&distance<tlen){
char rc = s.charAt(r++);
if(map.containsKey(rc)){
temp.put(rc, temp.getOrDefault(rc, 0)+1);
if(temp.get(rc)<=map.get(rc)){
distance++;//temp还处于小于等于map中对应的词频就distance加
}
}
}
while(distance==tlen&&l<r){
char lc = s.charAt(l++);
if(temp.containsKey(lc)){
temp.put(lc, temp.get(lc)-1);//当前L走过的字符lc在temp中, temp词频减1
if(temp.get(lc)<map.get(lc)){
if(minR-minL>r-l){//更新子串边界
minR=r;minL=l-1;
}
distance--;//不满足条件,也就说temp对应词频低于map中的词频distance减
}
}
}
}
if(minR>slen||minL<0||tlen>slen){//无解的情况
return "";
}
return s.substring(minL, minR);
}
}
原题如下:
难度困难963收藏分享切换为英文接收动态反馈
给你一个字符串
s
、一个字符串t
。返回s
中涵盖t
所有字符的最小子串。如果s
中不存在涵盖t
所有字符的子串,则返回空字符串""
。注意:如果
s
中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = "ADOBECODEBANC", t = "ABC" 输出:"BANC"示例 2:
输入:s = "a", t = "a" 输出:"a"
总结一下
调试花了许多时间,今后注意关注容易出错的点,不要漫无目的调试。
标签:子串,distance,懒惰,map,拒绝,day16,词频,slen,minR 来源: https://blog.csdn.net/qq_32662795/article/details/113938277