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;
    }
}
相关推荐
散峰而望19 小时前
【数据结构】单调栈与单调队列深度解析:从模板到实战,一网打尽
开发语言·数据结构·c++·后端·算法·github·推荐算法
qwehjk200819 小时前
内存泄漏自动检测系统
开发语言·c++·算法
tankeven19 小时前
HJ153 实现字通配符*
c++·算法
旖-旎19 小时前
位运算(两整数之和)(3)
c++·算法·leetcode·位运算
酉鬼女又兒19 小时前
零基础入门前端 第十三届蓝桥杯省赛 :水果拼盘 Flex一篇过(可用于备赛蓝桥杯Web应用开发)
前端·css·职场和发展·蓝桥杯·css3
2301_8166512219 小时前
C++与Rust交互编程
开发语言·c++·算法
zhaoshuzhaoshu19 小时前
微内核架构与事件驱动架构的区别与联系详细对比
职场和发展·架构
ab15151719 小时前
3.28完成9、16、20、98、100、55、57
算法
带娃的IT创业者19 小时前
营养食谱推荐引擎:基于规则与协同过滤的混合算法
算法·规则引擎·协同过滤·健康管理·食谱推荐·营养搭配·家庭饮食
扶摇接北海17619 小时前
洛谷:P1307 [NOIP 2011 普及组] 数字反转
c++·算法·洛谷