当前位置: 首页 > news >正文

【leetcode hot 100 76】最小覆盖子串

解法一:(滑动窗口)在 s 上滑动窗口,通过移动 r 指针不断扩张窗口。当窗口包含 t 全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口。

class Solution {
    // <字母, 出现的次数>
    Map<Character, Integer> map_s = new HashMap<>();
    Map<Character, Integer> map_t = new HashMap<>();

    public String minWindow(String s, String t) {
        for(int i=0;i<t.length();i++){
            // map_t.getOrDefault(a,0):若a在map_t内,则返回key=a的value,否则返回0(默认值)。
            map_t.put(t.charAt(i), map_t.getOrDefault(t.charAt(i),0)+1);
        }
        int left=0, right=-1;
        // Integer.MAX_VALUE的使用
        // left_len和right_len不能=0,后面return的判断left_len==right_len会忽略(s=a,t=a)的情况
        int min_len=Integer.MAX_VALUE, left_len=-1, right_len=-1;
        while(right<s.length()){
            right++; // 不能放在后面,return的s.substring回错误,计算不出(s=a,t=a)的情况
            if(right<s.length() && map_t.containsKey(s.charAt(right))){
                // 放入map_s中,计数
                map_s.put(s.charAt(right), map_s.getOrDefault(s.charAt(right),0)+1);
            }
            while(check() && left<=right){
                // 是while(left++直到最小值)不是if()
                if(min_len > (right-left+1)){
                    min_len = right-left+1;
                    left_len = left;
                    right_len = right+1;
                }
                if(map_t.containsKey(s.charAt(left))){
                    // 一定存在,默认值为0也可
                    map_s.put(s.charAt(left), map_s.getOrDefault(s.charAt(left),0)-1);
                }
                left++;
            }
        }
        return left_len==-1 ? "" : s.substring(left_len,right_len);
    }

    public boolean check(){
        Iterator iter = map_t.entrySet().iterator();
        while(iter.hasNext()){
            Map.Entry entry = (Map.Entry) iter.next();
            Character key = (Character) entry.getKey();
            Integer value = (Integer) entry.getValue();
            if(map_s.getOrDefault(key,0) < value){
                return false;
            }
        }
        return true;
    }
}

注意:

  • 对于char类型,其对应的包装类是Character
  • 判断某一key值是否存在:map_s.containsKey(),而不是map_s.isContainsKey()
  • map_t.getOrDefault(a,0):若a在map_t内,则返回key=a的value,否则返回0(默认值)。
  • 迭代:
Iterator iter = map_t.entrySet().iterator();
while(iter.hasNext()){
	Map.Entry entry = (Map.Entry) iter.next();
    Character key = (Character) entry.getKey();
    Integer value = (Integer) entry.getValue();
}

相关文章:

  • TypeScript系列01-类型系统全解析
  • 【中值滤波器(Median Filter)详解】
  • go routine 并发和同步
  • 虚拟机的IP配置
  • 网络安全月度报告
  • LLM 对话框组件 | 字节青训营前端开发项目
  • 计算机网络-实验四子网划分
  • 拒绝被假量薅羊毛,游戏渠道反作弊解决方案发布
  • go类型转换
  • Docker 模拟 kubernetes 的 pod
  • 【C++】:STL详解 —— priority_queue类
  • docker关闭mysql端口映射的使用
  • 计算机基础面试(数据结构)
  • Laravel从入门到精通:开启高效开发之旅
  • C++:多态与虚函数
  • Leetcode 刷题记录 01 —— 哈希
  • 《Java 加密工具与技术》8: X.509证书和属性证书
  • 【计算机网络】考研复试高频知识点总结
  • Android Studio 安装2022版稳定版 2022.3.1 详细操作(带图展示)
  • 机器学习算法——分类任务
  • 琼海商城网站建设/南京百度推广优化
  • 做网站多少钱角西宁君博特惠/短视频seo关键词
  • 监控网站模版/百度搜索词热度查询
  • 彩票网站给实体店做代销/郑州百度快照优化排名
  • 孝感网站建设软件/网络营销软文案例
  • 厦门园网站忱建设/百度广告代理商