leetcode 76 滑动窗口法
题目在这里 leetcode 76
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
示例1:
输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
示例2:
输入:s = “a”, t = “a”
输出:“a”
题解:
class Solution {
public:
string minWindow(string s, string t) {
vector<int> need(128,0);
int count = t.size();
int s_size = s.size();
int right = 0;
int left = 0;
int start = 0;
int size = INT_MAX;
for(char c : t)
{
need[c]++;
}
while(right<s_size){
char i = s[right];
if(need[i] > 0){
count -= 1;
}
need[i] -= 1;
while(count==0){
char j = s[left];
need[j] += 1;
if(need[j]>0){
count += 1;
if(right-left+1<size){
start = left;
size = right-left+1;
}
}
left+=1;
}
right +=1;
}
return size==INT_MAX ? "" : s.substr(start,size);
}
};
两个问题
一:如何判断s中包含了t?
答:设置一个长度等于t.size的计数count,建立一个长度26的列表,26个字母一一对应,初始话时将t的所有字母遍历一遍,字母每出现一次列表对应位置的数加一。在滑动窗口的过程中,窗口中的字母每出现一次列表对应位置的数加一。如果滑过的字母在t中,count就减一,count==0时说明s包含了t。
二:0和1的巧妙运用
在对count的操作中,如何判断这个字母到底在不在t中?这就要用到1和0的关系,尽管只差了1,但是1和0的关系很玄妙。在窗口右端滑动时,先对count进行操作,再对列表的元素操作。在窗口左端滑动时,先对列表的元素操作,再对count操作,就可以达到目的。中间的奥妙还要自己体会。