滑动窗口思路(双端队列实现):
可以参考一下:力扣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){ //如果能对上,返回true
for(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;
//初始化q
for(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:
continue
elif tt[i]!=0 and g_s[i]>=tt[i]:
continue
else:
return False
return True
q=deque()
g_s=[0]*60
tt=[0]*60
res_len=0x3f3f3f3f
idx=0
s_len=len(s)
t_len=len(t)
if t_len>s_len:
return ""
idx_temp=0
res=""
#初始化q
for i in range(t_len):
q.append(s[i])
g_s[ord(s[i])-ord('A')]+=1
tt[ord(t[i])-ord('A')]+=1
if 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')]+=1
a_len+=1
#出队列
while 1:
temp=q[0]
g_s[ord(temp)-ord('A')]-=1
if check(g_s,tt)==False:
g_s[ord(temp)-ord('A')]+=1
break
else:
q.popleft()
a_len-=1
idx_temp+=1
#记录答案
if check(g_s,tt) and res_len>a_len:
idx=idx_temp
res_len=a_len
if res_len==0x3f3f3f3f:
return ""
end=idx+res_len
for i in range(idx,end):
res+=s[i]
return res