题意:
给出两个字符串 s 和 t,要求在 s 中找出最短的包含 t 中所有字符的连续子串。

方法:
双指针
思路:初始化两个计数 map。首先,遍历字符串 t 进行计数统计,得到 mp2 ;然后,利用双指针遍历字符串 s :1.初始化 左右指针;
2.先循环右指针统计字符(累加字符),得到 mp1 ,当遍历达到 mp2是mp1的子集时,说明已达到区间的右端点;
3.再循环左指针统计字符(累减字符),尽可能缩小字符串的长度来达到区间的左端点;
4.计算该区间的长度,并且维护长度的最大值。
class Solution {
public:
unordered_map<char,int> mp1,mp2;//两个计数数组
int check(){// 判断mp1所有的字符个数都大于等于mp2中的
for(auto x:mp2){
if(mp1[x.first]<mp2[x.first]){
return 0;
}
}
return 1;
}
string minWindow(string S, string T) {
for(int i=0;i<T.size();i++){//遍历字符串T,统计字符
mp2[T[i]]++;
}
int i=0,j=0,n=S.size();//双指针
string res;
int mi=1e9;
while(j<n){
if(mp2.count(S[j])){//存在该字符,则计数
mp1[S[j]]++;
}
while(check()){//区间的右端点满足,缩小左端点
int t=j-i+1;
if(mi>t){
mi=t;
res=S.substr(i,t);
}
mp1[S[i]]--;
i++;
}
j++;
}
return res;
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号