76. 最小覆盖子串(滑动窗口板子)

class Solution {
public:
    string minWindow(string s, string t) {
        unordered_map<char,int>need,window;
        for(char c:t) need[c]++;
        int left=0,right=0;
        int valid=0;           // valid 变量表示窗口中满足 need 条件的字符个数
        int start=0,len=INT32_MAX;
        while(right<s.size()){
            char c=s[right];
            right++;
            // 进行窗口内数据的一系列更新
            if(need.count(c)){
                window[c]++;
                if(window[c]==need[c])
                    valid++;
            }
            // 什么时候窗口应该暂停扩大,开始移动 left 缩小窗口?
            while(valid==need.size()){
                // 我们要的结果应该在扩大窗口时还是缩小窗口时进行更新?

                if(right-left<len){
                    start = left;
                    len = right-left;
                }
                char d = s[left];
                left++;
                // 进行窗口内数据的一系列更新
                if(need.count(d)){
                    if(window[d]==need[d])
                        valid--;
                    window[d]--;
                }
            }
        }
        // 返回最小覆盖子串
        return len == INT_MAX ?"" : s.substr(start, len);
    }
};
  1. 字符串的排列
class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        unordered_map<char,int>need,window;
        for(char c:s1) need[c]++;
        int left=0,right=0;
        int valid=0;
        int len = s1.length();
        while(right<s2.size()){
            char c = s2[right];
            right++;
            if(need.count(c)){
                window[c]++;
                if(window[c]==need[c])
                    valid++;
            }
            while(right-left>=len){
                if(valid==need.size())
                    return true;
                char d=s2[left];
                left++;
                if(need.count(d)){
                    if(window[d]==need[d])
                        valid--;
                    window[d]--;
                }
            }
        }
        return false;
    }
};
  1. 无重复字符的最长子串
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left=0,right=0,res=0;
        unordered_map<char,int>window;
        while(right<s.size()){
            char c=s[right];
            right++;
            // 进行窗口内数据的一系列更新
            window[c]++;
            // 判断左侧窗口是否要收缩
            while(window[c]>1){
                // 进行窗口内数据的一系列更新
                char d = s[left];
                left++;
                window[d]--;
            }
            res=max(res,right-left);
        }
        return res;
    }
};
  1. 替换后的最长重复字符
class Solution {
public:
    int characterReplacement(string s, int k) {
        unordered_map<char,int>window;
        int left=0,right=0,res=0,maxCount=0;
        while(right<s.size()){
            window[s[right]]++;
            maxCount = max(maxCount,window[s[right]]);
            right++;
            while(right-left-maxCount>k){
                window[s[left]]--;
                left++;
                maxCount=0;
                for(auto&t:window)
                    maxCount = max(maxCount,t.second);
            }
            res = max(res,right-left);
        }
        return res;
    }
};
  1. 将 x 减到 0 的最小操作数
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int target = accumulate(nums.begin(),nums.end(),0)-x;
        int res=-1,left=0,right=0, tempSum=0,n=nums.size();
        while(right<n){
            tempSum+=nums[right];
            right++;
            while(tempSum>target && left<right){
                tempSum-=nums[left];
                left++;
            }
            if(tempSum==target){
                res =max(res,right-left);
            }
        }
        return res==-1?-1:n-res;
    }
};
  1. 最多 K 个重复元素的最长子数组
class Solution {
public:
    int maxSubarrayLength(vector<int>& nums, int k) {
        int left=0,right=0,n=nums.size();
        unordered_map<int,int>window;
        int res=0;
        while(right<n){
            int c=nums[right];
            right++;
            window[c]++;
            while(window[c]>k){
                int d=nums[left];
                left++;
                window[d]--;
            }
            res=max(res,right-left);
        }
        return res;
    }
};
  1. 考试的最大困扰度
class Solution {
public:
    int maxConsecutiveAnswers(string answerKey, int k) {
        int left=0,right=0,n=answerKey.length();
        int numT=0,numF=0,res=0;
        //最多k个T
        while(right<n){
            if(answerKey[right]=='T') numT++;
            else numF++;
            right++;
            while(numT>k&&numF>k){
                if(answerKey[left]=='T') 
                    numT--;
                else numF--;
                left++;
            }
            res = max(res,right-left);
        }
        return res;
    }
};

你可能感兴趣的:(LeetCode,算法,数据结构)