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

力扣76 最小覆盖子串 Java版本

文章目录

  • 题目描述
  • 代码


题目描述

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。

注意:

对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例 1:

输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
解释:最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、‘B’ 和 ‘C’。
示例 2:

输入:s = “a”, t = “a”
输出:“a”
解释:整个字符串 s 是最小覆盖子串。
示例 3:

输入: s = “a”, t = “aa”
输出: “”
解释: t 中两个字符 ‘a’ 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

m == s.length
n == t.length
1 <= m, n <= 105
s 和 t 由英文字母组成

进阶:你能设计一个在 o(m+n) 时间内解决此问题的算法吗?

代码

class Solution {
    public String minWindow(String s, String t) {
        Map<Character,Integer> need = new HashMap<>();//存储t中包含的字符及其需要的个数
        Map<Character,Integer> window = new HashMap<>();//存储滑动窗口中包含的字符及其字符的个数
        int valid = 0;//有效字符的个数,不在目标字符串t中的字符就不关心了
        int left = 0;//滑动窗口左边界
        int right = 0;//滑动窗口右边界
        int start = 0;//用来记录返回结果的左边界
        int minLen = Integer.MAX_VALUE;//用于更新满足条件的最小的字符串的长度
        //先把目标t的字符及其每个字符的数量更新到need中
        for(char ch :t.toCharArray()){
            need.put(ch,need.getOrDefault(ch,0)+1);
        }
        //不断更新右边界
        while (right<s.length()){
            char ch = s.charAt(right);
            right++;
            //如果当前字符是t中的字符
            if (need.containsKey(ch)){
                window.put(ch,window.getOrDefault(ch,0)+1);
                //这一步的判断是为了统计滑动窗口中多少个字符已经满足目标字符串t中字符个数了
                if (window.get(ch).equals(need.get(ch))){
                    valid++;
                }
            }
            //已经找到一个滑动窗口包含t中的所有字母就更新左边界来寻求最小覆盖子串
            while (valid==need.size()){
                //比之前统计的小就更新
                if (minLen>right-left){
                    start = left;
                    minLen = right-left;
                }
                //滑动窗口左边界右移
                char l = s.charAt(left);
                if (need.containsKey(l)){
                    window.put(l,window.get(l)-1);
                    if (window.get(l) < need.get(l)) valid--;
                }
                left++;
            }
        }
        if (minLen==Integer.MAX_VALUE){
            return "";
        }
        return s.substring(start,start+minLen);
    }
}

http://www.kler.cn/a/317561.html

相关文章:

  • 信号-3-信号处理
  • 【大数据学习 | flume】flume的概述与组件的介绍
  • 基于Python的网上银行综合管理系统
  • Llama架构及代码详解
  • 豆瓣均分9:不容错过的9本大模型入门宝藏书籍,非常详细收藏我这一篇就够了
  • 解决表格出现滚动条样式错乱问题
  • 面试知识点总结篇三
  • Linux-网络编程
  • MySQL record 06 part
  • Chainlit集成LlamaIndex实现知识库高级检索(BM25全文检索器)
  • 爬虫的流程
  • vulnhub(13):Digitalworld.local JOY(ftp 的未授权文件读写漏洞、文件覆盖提权)
  • 获取商品销量详情API:深入解析返回值,助力电商决策
  • hrm人力资源管理系统,绩效,考勤,薪酬,五险一金,等全面人力管理(源码+配套方案)
  • Java面试篇基础部分-ReentrantLock详解
  • 应用密码学第一次作业(9.23)
  • 油耳朵怎么清理干净?双十一可视挖耳勺排行榜
  • Python注释
  • gitlab默认克隆地址的修改
  • react-native和原生android的交互
  • Mysql 架构
  • 武汉正向科技 格雷母线检测方式 :车检,地检
  • 78、Python之函数式编程:funcy,功能更加齐全的函数式编程库
  • 等位基因与碱基:异同点解析
  • MS SQL Server 实战 排查多列之间的值是否重复
  • 局域网中实现一对一视频聊天(附源码)