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;
    }
}
相关推荐
Hi李耶3 小时前
【LeetCode】541.反转字符串 II
算法·leetcode·职场和发展
shylyly_3 小时前
104.二叉树的最大深度
数据结构·算法·104.二叉树的最大深度
AI科技星4 小时前
曲率‑挠率与 $\boldsymbol{\omega/c}$ 的关系、精算验证及其物理意义
c语言·开发语言·线性代数·算法·决策树·机器学习·ai科技星
沐籽李4 小时前
HuDiff在抗体人源化项目中的工程化落地
人工智能·算法·aidd·抗体设计
依然范特东4 小时前
强化学习笔记6--IS、PPO、TD、DQN、Actor-Critic
笔记·算法
一次旅行6 小时前
RLHF全链路深度解析:Reward Model数学推导+PPO完整实战,对比GRPO轻量化方案
人工智能·算法·机器学习
Wang's Blog6 小时前
AI Agent白手起家29: Few Shot 提示词工程实战
人工智能·算法
June`7 小时前
warp shuffle指令
c++·人工智能·算法·cuda
geovindu7 小时前
go:Bit Operation Algorithm
开发语言·后端·算法·golang·位运算法
坏柠7 小时前
C语言进阶:从零实现一个可靠的环形缓冲区,吃透回绕、边界与并发
java·c语言·算法