leetcode 最小覆盖子串 困难

leetcode 最小覆盖子串 困难

 

 

尺取:在当前满足条件的情况下,移动左指针,再次判断是否满足条件即可。然后取整体答案的最小值。

满足条件的 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';
    }
};

 

上一篇:python使用百度api识别口罩-


下一篇:CSS 类也可以与伪元素配合特殊效果