经典滑动窗口试题(二)

简介: 经典滑动窗口试题(二)

一、水果成篮


1、题目讲解

a957601d2a2d40898b2de0c8b1cfc247.png

bb501a559a454a7ea1132f53422584ed.png


2、讲解算法思路

68aa0d4311f446629199bcb177e799c0.png

3、代码实现

class Solution {
public:
    int totalFruit(vector<int>& f) {
        int n=f.size();
        unordered_map<int,int> hash;
        int ret=0;
        for(int left=0,right=0;right<n;right++)
        {
            hash[f[right]]++;
            while(hash.size()>2)
            {
                hash[f[left]]--;
                if(hash[f[left]]==0)
                {
                    hash.erase(f[left]);
                }
                left++;
            }
             ret=max(ret,right-left+1);
        }
        return ret;
    }
};



二、找到字符串中所有字母异位词


1、题目讲解

c96c05927f094743ae1f10ba9eb2468d.png

2、讲解算法思路

81424b9677294b65bfa37a52075b7a49.png

3、代码实现

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ret;
        int hash1[256]={0},len=p.size();
        for(char ch:p) hash1[ch]++;
        int hash2[256]={0};
        for(int left=0,right=0,count=0;right<s.size();right++)
        {
            char in=s[right];
            hash2[in]++;
            if(hash2[in]<=hash1[in]) count++;
            if(right-left+1>len)
            {
                char out=s[left];
                if(hash2[out]<=hash1[out]) count--;
                hash2[out]--;
                left++;
            }
            if(count==len)
            {
                ret.push_back(left);
            }
        }
        return ret;      
    }
};



三、串联所有单词的子串


1、题目讲解

38e21e01637b48bfb0316485cd9c0276.png

95b8a865cb0642da9199958c946098d2.png

2、讲解算法思路

958e89ffb1474d2cbe4e66e974c961f0.png

3、代码实现

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> ret;
        unordered_map<string,int> hash1;
        for(auto ch:words)
        {
            hash1[ch]++;
        }
        int len=words[0].size(),m=words.size();
        for(int i=0;i<len;i++)
        {
            unordered_map<string,int> hash2;
             for(int left=i,right=i,count=0;right+len<=s.size();right+=len)
             {
                 string in=s.substr(right,len);
                 hash2[in]++;
                 if(hash1.count(in) && hash2[in]<=hash1[in]) count++;
                 if(right-left+1>len*m)
                 {
                     string out=s.substr(left,len);
                     if(hash1.count(out) && hash2[out]<=hash1[out]) count--;
                     hash2[out]--;
                     left+=len;
                 }
                 if(count==m) ret.push_back(left);
             }
        }
        return ret;
    }
};



四、最小覆盖子串


1、题目讲解

d7a6b107c4d5476685adbad76c208f74.png

2、讲解算法思路

536b73073ca9440c99cf35f9e6b92f4f.png

3、代码实现

代码一

class Solution {
public:
    string minWindow(string s, string t) {
        int hash1[256]={0};
        int kinds=0;
        for(auto ch:t)
        {
            if(hash1[ch]==0) kinds++;
            hash1[ch]++;
        }
        int hash2[256]={0};
        int minlen=INT_MAX,begin=-1;
        for(int left=0,right=0,count=0;right<s.size();right++)
        {
            char in=s[right];
            hash2[in]++;
            if(hash2[in]==hash1[in])  count++;
            while(count==kinds)
            {
                if(right-left+1<minlen)
                {
                    minlen=right-left+1;
                    begin=left;
                }
                char out=s[left++];
                if(hash2[out]--==hash1[out])  count--;    
            } 
        }
        if(begin==-1) return "";
        else return s.substr(begin,minlen);
    }
};

代码二 不使用kinds来计算种类

class Solution {
public:
    string minWindow(string s, string t) 
    {
        int hash1[256]={0},n=t.size();
        for(char ch:t)
        {
            hash1[ch]++;
        }
        int begin=-1,len=INT_MAX;
        int hash2[256]={0};
        for(int left=0,right=0,count=0;right<s.size();right++)
        {
            char in=s[right];
            hash2[in]++;
            if(hash2[in]<=hash1[in]) count++;
            while(count==n)
            {
                if(right-left+1<len)
                {
                    begin=left;
                    len=right-left+1;
                }
                char out=s[left];
                if(hash2[out]<=hash1[out]) count--;
                hash2[out]--;
                left++;
            }
        }
        if(begin==-1) return "";
        else return  s.substr(begin,len);
    }
};


目录
相关文章
|
7月前
|
算法
经典滑动窗口试题(一)
经典滑动窗口试题(一)
69 0
滑动窗口经典例题
滑动窗口经典例题
|
5月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
6月前
|
算法 搜索推荐 测试技术
力扣经典150题解析之二十九:三数之和
力扣经典150题解析之二十九:三数之和
48 0
|
6月前
|
C语言
|
7月前
|
算法 索引
【力扣经典面试题】55. 跳跃游戏
【力扣经典面试题】55. 跳跃游戏
|
7月前
|
算法 测试技术 索引
【力扣经典面试题】45. 跳跃游戏 II
【力扣经典面试题】45. 跳跃游戏 II
|
7月前
|
算法 容器
经典双指针算法试题(一)
经典双指针算法试题(一)
61 0
|
7月前
|
算法
经典双指针算法试题(二)
经典双指针算法试题(二)
62 0
|
计算机视觉
经典矩阵试题(一)
经典矩阵试题(一)
92 0