給你一個字符串 S、一個字符串 T,請在字符串 S 裏面找出:包含 T 所有字母的最小子串。
示例:
輸入: S = "ADOBECODEBANC", T = "ABC" 輸出: "BANC"
說明:
- 如果 S 中不存這樣的子串,則返回空字符串
""
。 - 如果 S 中存在這樣的子串,我們保證它是唯一的答案。
i是前指針,j是後指針,i>=j,每次遍歷的時候次數都減一,當減到零爲止有效字符數+1,有效字符數達到匹配串時,更新答案,注意更新後指針,當且僅當已經出現兩次匹配串時才更新後指針,注意要把減去的次數加回來!
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char,int>p;
for(char c:t)p[c]++;
int k=p.size();
int st=0,len=INT_MAX,cnt=0;
for(int i=0,j=0,cnt=0;s[i];i++)
{
if(p[s[i]]==1)cnt++;
p[s[i]]--;
while(p[s[j]]<0)p[s[j++]]++;
if(cnt==k)
{
if(len>i-j+1)
{
len=i-j+1;
st=j;
}
}
//cout<<cnt<<endl;
}
return len==INT_MAX?"":s.substr(st,len);
}
};