最小覆盖子串(双指针)
给你一个字符串、一个字符串。返回中涵盖所有字符的最小子串。如果中不存在涵盖所有字符的子串,则返回空字符串 "" 。
注意:
对于中重复字符,我们寻找的子字符串中该字符数量必须不少于中该字符数量。
如果中存在这样的子串,我们保证它是唯一的答案。
示例 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
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);
}
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2020-11-17 D - Vasya And The Matrix (数论异或)