• leetcode 1208.尽可能使字符串相等 滑动窗口


    题目描述

    尽可能使字符串相等
    在这里插入图片描述


    思路

    假定字符串 s s s t t t 的长度均为 n n n,对于任意 0 ≤ i < n 0≤i0i<n,将 s [ i ] s[i] s[i]变成 t [ i ] t[i] t[i] 的开销是 ∣ s [ i ] − t [ i ] ∣ | s[i]-t[i] | s[i]t[i]
    ,因此可以创建一个长度为 n n n 的数组 d i f f diff diff,其中 d i f f [ i ] = ∣ s [ i ] − t [ i ] ∣ diff[i]= |s[i]−t[i]| diff[i]=s[i]t[i]
    创建数组 d i f f diff diff 之后,问题转化成计算数组 d i f f diff diff 的元素和不超过 m a x C o s t maxCost maxCost最长子数组的长度
    由于 d i f f diff diff 的的每个元素都是非负的,因此可以用滑动窗口的方法得到符合要求的最长子数组的长度。

    滑动窗口的思想是,维护两个指针 s t a r t start start e n d end end 表示数组 d i f f diff diff 的子数组的开始下标和结束下标,满足子数组的元素和不超过 m a x C o s t maxCost maxCost,子数组的长度是 e n d − s t a r t + 1 end−start+1 endstart+1。初始时, s t a r t start start e n d end end 的值都是 0 0 0
    另外还要维护子数组的元素和 s u m sum sum,初始值为 0 0 0。在移动两个指针的过程中,更新 s u m sum sum 的值,判断子数组的元素和是否大于 m a x C o s t maxCost maxCost,并决定应该如何移动指针。

    为了得到符合要求的最长子数组的长度,应遵循以下两点原则:

    • s t a r t start start 的值固定时, e n d end end 的值应尽可能大;
    • e n d end end 的值固定时, s t a r t start start 的值应尽可能小。

    基于上述原则,滑动窗口的做法如下:

    1. d i f f [ e n d ] diff[end] diff[end] 的值加到 s u m sum sum
    2. 如果 s u m ≤ m a x C o s t sum≤maxCost summaxCost,则子数组的元素和不超过 m a x C o s t maxCost maxCost,使用当前子数组的长度 e n d − s t a r t + 1 end−start+1 endstart+1 更新最大子数组的长度;
    3. 如果 s u m > m a x C o s t sum>maxCost sum>maxCost,则子数组的元素和大于 m a x C o s t maxCost maxCost,需要向右移动指针 s t a r t start start 并同时更新 s u m sum sum的值,直到 s u m ≤ m a x C o s t sum≤maxCost summaxCost,此时子数组的元素和不超过 m a x C o s t maxCost maxCost,使用子数组的长度 e n d − s t a r t + 1 end−start+1 endstart+1 更新最大子数组的长度;
    4. 将指针 e n d end end 右移一位,重复上述步骤,直到 e n d end end 超出数组下标范围。

    遍历结束之后,即可得到符合要求的最长子数组的长度,即字符串可以转化的最大长度。


    代码

    class Solution {
    public:
        int equalSubstring(string s, string t, int maxCost) {
            int n=s.length();
            vector<int> diff(n,0);
    
            for(int i=0;i<n;i++)
                diff[i]=abs(s[i]-t[i]);
    
            int res=-1,sum=0;
            int start=0,end=0;
            while(end<n)
            {
                sum+=diff[end];
                while(sum>maxCost)
                {
                    sum-=diff[start];
                    start++;
                }
                res=max(res,end-start+1);
                end++;
            }
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

  • 相关阅读:
    浏览器窗口间的通信
    Java中常用API总结(1)—— Math类(含底层源码阅读)
    Hive insert插入数据与with子查询
    JavaEE 线程状态及线程安全
    基于飞浆NLP的BERT-finetuning新闻文本分类
    详解ThreadLocal
    uniapp中如何进行微信小程序的分包
    vue基础3(六)解构赋值与解构插槽,动态插槽,插槽缩写#
    基于PHP+MySQL的手机产品销售商城电商平台系统
    java线程转储分析
  • 原文地址:https://blog.csdn.net/weixin_45798993/article/details/126332814