滑动窗口思路(双端队列实现):
可以参考一下:力扣hot8---滑动窗口-CSDN博客以及力扣hot9---滑动窗口-CSDN博客。
使用滑动窗口有以下几个步骤:初始化双端队列(将s的前t_len个元素入队,此时检验是否满足最小覆盖子串的条件,如果满足,直接结束),接下来正式进入滑动过程。首先是进入元素(也就是第t_len+1个元素),再进行排出元素(也就是从队列中的第一个元素开始判断是否可以出队列,条件是什么呢?首先将队列中元素的个数实时的记录在g_s数组中,将字符串t中元素的个数记录在tt数组中,如果g_s数组中的每一个元素个数都大于tt中的元素个数,那么就可以出队列。),最后进行判断当下是否为可行解甚至是最优解(也就是答案子串长度最小),如果是当前的最优解,则进行记录。
代码:
C++:
class Solution {
public:bool check(vector<int>& g_s,vector<int>& tt){ //如果能对上,返回truefor(int i=0;i<60;i++){if(tt[i]==0){continue;}else if(tt[i]!=0 && g_s[i]>=tt[i]){continue;}else{return false;}}return true;}string minWindow(string s, string t) {//双端队列deque<char> q;vector<int> g_s(60,0);vector<int> tt(60,0);int res_len=0x3f3f3f3f;int idx=0;int s_Len=s.size();int t_len=t.size();if(t_len>s_Len){return "";}int idx_temp=0;string res;//初始化qfor(int i=0;i<t_len;i++){q.push_back(s[i]);g_s[s[i]-'A']++;tt[t[i]-'A']++;}if(check(g_s,tt)){for(int i=0;i<t_len;i++){res.push_back(s[i]);}return res;}//正式考察for(int i=t_len;i<s_Len;i++){int a_len=q.size();//进队列q.push_back(s[i]);g_s[s[i]-'A']++;a_len++;//出队列while(true){char temp=q.front();g_s[temp-'A']--;if(!check(g_s,tt)){g_s[temp-'A']++;break;}else{q.pop_front();a_len--;idx_temp++;}}//记录答案if(check(g_s,tt) && res_len>a_len){idx=idx_temp;res_len=a_len;}}//创造答案if(res_len==0x3f3f3f3f){return "";}int end=idx+res_len;for(int i=idx;i<end;i++){res.push_back(s[i]);}return res;}
};
病了好几天,怕Python不会写了()
Python:
class Solution:def minWindow(self, s: str, t: str) -> str:def check(g_s:List[int],tt:List[int]) -> bool:for i in range(60):if tt[i]==0:continueelif tt[i]!=0 and g_s[i]>=tt[i]:continueelse:return Falsereturn Trueq=deque()g_s=[0]*60tt=[0]*60res_len=0x3f3f3f3fidx=0s_len=len(s)t_len=len(t)if t_len>s_len:return ""idx_temp=0res=""#初始化qfor i in range(t_len):q.append(s[i])g_s[ord(s[i])-ord('A')]+=1tt[ord(t[i])-ord('A')]+=1if check(g_s,tt):for i in range(t_len):res+=s[i]return res#正式考察for i in range(t_len,s_len):a_len=len(q)#进队列q.append(s[i])g_s[ord(s[i])-ord('A')]+=1a_len+=1#出队列while 1:temp=q[0]g_s[ord(temp)-ord('A')]-=1if check(g_s,tt)==False:g_s[ord(temp)-ord('A')]+=1breakelse:q.popleft()a_len-=1idx_temp+=1#记录答案if check(g_s,tt) and res_len>a_len:idx=idx_tempres_len=a_lenif res_len==0x3f3f3f3f:return ""end=idx+res_lenfor i in range(idx,end):res+=s[i]return res