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;
    }
}
相关推荐
流云鹤2 小时前
2026牛客寒假算法基础集训营4(A B C I H F G)
算法
每天要多喝水2 小时前
动态规划Day31:子序列长度1
算法·动态规划
lxl13072 小时前
C++算法(3)二分算法
数据结构·c++·算法
随意起个昵称2 小时前
Dijstra算法学习笔记
笔记·学习·算法
我命由我123452 小时前
Photoshop - Photoshop 工具栏(60)污点修复工具
ui·adobe·职场和发展·求职招聘·职场发展·课程设计·photoshop
lifallen2 小时前
笛卡尔树 (Cartesian Tree)
java·数据结构·算法
ab1515172 小时前
2.15完成105、106、110
数据结构·算法
Clarence Liu2 小时前
用大白话讲解人工智能(5) SVM支持向量机:找一条“最宽的分隔线“
人工智能·算法·支持向量机
不想看见4042 小时前
N-Queens -- 回溯法 -- 力扣101算法题解笔记
java·数据结构·算法