滑动窗口解题模板

滑动窗口解题模板

问题

Leetcode 1208

解题模板

#include <bits/stdc++.h>

using namespace std;

class Solution
{
public:
    int equalSubstring(string s, string t, int maxCost)
    {
        int sum = 0;
        int ans = 0;
        int st = 0;
        int ed = 0;
        // 循环不变式:在每一次循环之前都面对一个新的窗口[st,ed]
        // 终止:ed到达末尾,此时只能收缩st,窗口只会越变越小,因此为结束条件
        while(ed < s.size())
        {
            // 更新窗口
            sum += abs(s[ed] - t[ed]);
            // 判断窗口是否正确,如果不正确,并且还能收缩,那么就收缩
            while(sum > maxCost && st <= ed)
            {
                sum -= abs(s[st] - t[st]);
                st++;
            }
            // 更新记录
            ans = max(ans,ed - st + 1);
            // 创建下一个窗口
            ed++;
        }
        return ans;
    }
};

最大与最小差值问题

求最大与最小差值问题,可以先排序,然后再通过尺取法进行计算。

最小覆盖问题

LeetCode 76

滑动窗口经典题目。

class Solution
{
  public:
    string minWindow(string s, string t)
    {
        vector<int> sd(100);

        for (int i = 0; i < t.size(); i++)
        {
            sd[t[i] - 'A']++;
        }
        int pk = 0;
        for (int i = 0; i < 100; i++)
            if (sd[i] != 0)
                pk++;
        int r = 0, l = 0;
        vector<int> cnt(100);
        int kp = 0;
        int mi = 9999999;
        int al = 0;
        int ar = 0;
        while (r < s.size())
        {
            cnt[s[r] - 'A']++;
            if (cnt[s[r] - 'A'] == sd[s[r] - 'A'])
                kp++;

            while (l <= r && cnt[s[l] - 'A'] > sd[s[l] - 'A'])
            {
                cnt[s[l] - 'A']--;
                l++;
            }

            if (kp == pk && r - l + 1 < mi)
            {
                mi = r - l + 1;
                al = l;
                ar = r;
            }
            r++;
        }

        if (mi == 9999999)
            return "";
        else
            return s.substr(al, ar - al + 1);
    }
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值