leetcode-最小覆盖子串

给定两个字符串 s 和 t,长度分别是 m 和 n,返回 s 中的 最短窗口 子串,使得该子串包含 t 中的每一个字符(包括重复字符)。如果没有这样的子串,返回空字符串 ""。

测试用例保证答案唯一。

示例 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 由英文字母组成

思路:维护区间内s字符串的字符数,因为题目中说的是覆盖t串,所以判断s字符串指定区间内的t字符串中的字符数是否大于t中的字符数。

c 复制代码
class Solution {
    public String minWindow(String s, String t) {
        Map<Character,Integer> mp = new HashMap<>();
        int[] sArray = new int[53];
        int[] tArray = new int[53];

        for(int i = 0;i<t.length();i++){
            if(t.charAt(i)>='a'&&t.charAt(i)<='z'){
                tArray[t.charAt(i)-'a']++;
            }
            if(t.charAt(i)>='A'&&t.charAt(i)<='Z'){
                tArray[t.charAt(i)-'A'+26]++;
            }
        }
        int start = 0;
        int len = s.length()+1;
        String res = "";
        for(int i = 0;i<s.length();i++){
            if(s.charAt(i)>='a' && s.charAt(i)<='z'){
                sArray[s.charAt(i)-'a']++;
            }
            if(s.charAt(i)>='A' && s.charAt(i)<='Z'){
                sArray[s.charAt(i)-'A'+26]++;
            }
            while(start<=i&&isAllContains(sArray,tArray)){
                if(len>i-start+1){
                    len = i-start+1;
                    res = s.substring(start,i+1);
                }
                if(s.charAt(start)>='a' && s.charAt(start)<='z'){
                    sArray[s.charAt(start)-'a']--;
                }
                if(s.charAt(start)>='A' && s.charAt(start)<='Z'){
                    sArray[s.charAt(start)-'A'+26]--;
                }
                start++;
            }
        }
        return res;
    }
    boolean isAllContains(int[] s,int[] t){
        boolean flag = true;
        for(int i = 0;i<53;i++){
            if(t[i]>s[i]){
                flag = false;
                break;
            }
        }
        return flag;
    }
}
相关推荐
罗湖老棍子11 小时前
Biorhythms(信息学奥赛一本通- P1639)
算法·数论·裴蜀定理·扩展欧几里得·扩展中国剩余定理
奋发向前wcx16 小时前
CSP-J复赛模拟赛4 王晨旭补题 2026.10.5
算法
念何架构之路18 小时前
zap采样器与性能优化内幕
算法·性能优化·哈希算法
晒太羊的猫19 小时前
hot100动态规划刷题
算法·动态规划
weixin_5310946920 小时前
heap_4内存管理
java·开发语言·算法
余额瞒着我当琳20 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
程序员南飞20 小时前
win系统安装minio
java·数据结构·算法
青少儿编程课堂20 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛
我命由我1234520 小时前
Photoshop - Photoshop 矢量蒙版
学习·职场和发展·产品运营·求职招聘·职场发展·产品经理·photoshop
longlongzihan21 小时前
LeetCode 5. 最长回文子串:从暴力匹配到中心扩展的思维演进
c++·算法·leetcode