最小覆盖子串(双指针)

给你一个字符串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 由英文字母组成

class Solution {
public:
    string minWindow(string s, string t) {
        int l=0,r=0;
        int n=s.size(),m=t.size();
        int ss=0;
        int minlen=2e9;
        string ans="";
        int mp[300];
        for(int i=0;i<300;i++){
            mp[i]=0;
        }
        for(int i=0;i<t.size();i++){
            mp[t[i]]++;
        }
        int ml=-1,mr=-1;
        while(1){
            while(r<n&&ss<m){
                mp[s[r]]--;
                if(mp[s[r]]>=0) ss++;
                r++;
            }
            if(ss<m||r>n){
                break;
            }
            if(r-l+1<minlen){
                minlen=min(minlen,r-l+1);
                ml=l,mr=r;
            }
            mp[s[l]]++;
            if(mp[s[l]]>0){
                ss--;
            }
            l++;//ADOBECODEABANC  AABC
        }
        if(ml==-1){
            return "";
        }
        else{
            return s.substr(ml,mr-ml);
        }
    }
};
class Solution {
public:
    string minWindow(string s, string t) {
         unordered_map <char, int> count;
        for (auto c : t) count[c] ++;
        int len = 0, n = s.size();
        int minlen = INT_MAX;
        string ans = "";
        int l = 0, r = 0;
        int ml=-1,mr=-1;
        for ( ; r < n; r ++) {
            count[s[r]] --;
            if (count[s[r]] >= 0) len ++;
            while (len == t.size()) {
                if (r - l + 1 <= minlen) {
                    minlen = r - l + 1;
                    ml=l;
                    mr=r;
                }
                count[s[l]] ++;
                if (count[s[l]] > 0) len --;
                l ++;
            }
        }
        if(ml==-1){
            return "";
        }
        else{
            return  s.substr(ml, mr - ml + 1);
        }
    }
};
posted @   lipu123  阅读(5)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2020-11-17 D - Vasya And The Matrix (数论异或)
点击右上角即可分享
微信分享提示