题意:
给出两个字符串 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; } };
时间复杂度:空间复杂度: