其他分享
首页 > 其他分享> > 拒绝懒惰day16

拒绝懒惰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);
    }
}

原题如下:

76. 最小覆盖子串

难度困难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