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); } };