题解 | #最小覆盖子串#
最小覆盖子串
https://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac
class Solution { public: /** * * @param S string字符串 * @param T string字符串 * @return string字符串 */ string minWindow(string S, string T) { // write code here //要匹配的字符, 和要匹配的个数 map<char, int> Tmap; //字串的开始索引 int bgIdx = 0; //最小窗口 int winSize = INT_MAX; //记录要匹配的每一个元素的个数 for (auto c : T) { Tmap[c]++; } //记录要匹配字符的个数 int elemCnt = T.size(); int l = 0; for (int r = 0; r < S.size(); ++r) { //如果属于要匹配的字符 if (Tmap.find(S[r]) != Tmap.end()) { //如果这个字符没有被匹配过,减小要匹配的个数 if(Tmap[S[r]] > 0) elemCnt--; //匹配到对应的字符 Tmap[S[r]]--; } if(elemCnt == 0) { //滑动窗口大小不为 0, 且不属于要统计的字符或者被统计的字符在当前窗口有冗余 while (l < r && ( Tmap.find(S[l]) == Tmap.end() || Tmap[S[l]] < 0 )) { //如果为负表示,窗口有当前字符的冗余,当滑动窗口时可以继续向前滑动 if(Tmap.find(S[l]) != Tmap.end()) ++Tmap[S[l]]; ++l; } //此时 r - l 为 匹配的窗口 int curWin = (r-l+1); //如果小于最小,则更新窗口和起始索引 if( curWin < winSize) { winSize = curWin; bgIdx = l; } //如果当前窗口的左端字符为 X,继续滑动,用窗口右端寻找下一个 X if (l < r) { //增加 X 的要统计的个数 Tmap[S[l]] = 1; //一次寻找一个 elemCnt = 1; ++l; } } } if (winSize == INT_MAX) return ""; return S.substr(bgIdx, winSize); } };