尺取:在当前满足条件的情况下,移动左指针,再次判断是否满足条件即可。然后取整体答案的最小值。
满足条件的 check:记录每个字母用的次数,然后依次比较。
class Solution { public: string minWindow(const string &s, const string &t) { memset(lower, 0, sizeof(lower)); memset(upper, 0, sizeof(upper)); for(auto &item : t) { isLower(item) ? (++ lower[0][item - 'a']) : (++ upper[0][item - 'A']); } int ret = INT_MAX, retL = -1; int l = 0; for(int r = 0; r < s.size(); ++ r) { isLower(s[r]) ? (++ lower[1][s[r] - 'a']) : (++ upper[1][s[r] - 'A']); while (l <= r && check()) { if(ret > r - l + 1) { ret = r - l + 1; retL = l; } isLower(s[l]) ? (-- lower[1][s[l] - 'a']) : (-- upper[1][s[l] - 'A']); ++ l; } } return retL == -1 ? "" : s.substr(retL, ret); } private: int lower[2][26]; // 小写, [0][x] 对应 t int upper[2][26]; // 大写, [0][x] 对应 t bool check() { for(int i = 0; i < 26; ++ i) { if(lower[0][i] > lower[1][i] || upper[0][i] > upper[1][i]) return false; } return true; } bool isLower(const char &ch) { return ch >= 'a' && ch <= 'z'; } };