https://oj.leetcode.com/problems/minimum-window-substring/
线性复杂度的限制下,考虑使用滑动窗口法。这个方法的思路就是维持一个窗口,窗口向右边界扩张以满足限制条件。窗口左边界收缩以尽量使其最小。
注意这个题目可能是一个典型的滑动窗口方法的实现。外部循环移动左边界i,循环内部扩张右边界p以满足限制条件。并且内外都有终止可能。
使用两个map和一个计数变量以快速统计条件限制的满足情况。
class Solution {
public:
int n,m;
string minWindow(string S, string T) {
map <char,int> cm;
map <char,int> stat;
n=S.length();
m=T.length();
for (int i=0;i<m;i++){
if (cm.find(T[i])==cm.end()){
cm[T[i]]=1;
}
else{
cm[T[i]]++;
}
stat[T[i]]=0;
}
int res=numeric_limits<int>::max();
typedef pair <int,int> scpair;
scpair minw;
int q=0;
int count=0;
for (int i=0;i<n;i++){
bool endFlag=false;
while(count<m){
q++;
if (q>n){
endFlag=true;
break;
}
if (cm.find(S[q-1])==cm.end()){continue;}
if (stat[S[q-1]]<cm[S[q-1]]){
count++;
}
stat[S[q-1]]++;
}
if (endFlag){break;}
if (res > q-i){
res=q-i;
minw=scpair(i,q);
}
if (cm.find(S[i])==cm.end()){continue;}
stat[S[i]]--;
if (stat[S[i]]<cm[S[i]]){count--;}
}
if (res>n){return "";}//no win
return S.substr(minw.first,minw.second-minw.first);
}
};
LeetCode-Minimum Window Substring-最小窗口子串-滑动窗口算法(尺取法)
原文:http://www.cnblogs.com/yangsc/p/4005519.html