经典滑动窗口试题(二)

在这里插入图片描述


📘北尘_个人主页

🌎个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心


一、水果成篮

1、题目讲解

在这里插入图片描述
在这里插入图片描述

2、讲解算法思路

在这里插入图片描述

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、题目讲解

在这里插入图片描述

2、讲解算法思路

在这里插入图片描述

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、题目讲解

在这里插入图片描述
在这里插入图片描述

2、讲解算法思路

在这里插入图片描述

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、题目讲解

在这里插入图片描述

2、讲解算法思路

在这里插入图片描述

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);
    }

};

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北尘_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值