美文网首页
leetcode尽可能使字符串相等 -- 滑动窗口

leetcode尽可能使字符串相等 -- 滑动窗口

作者: 夏liao夏天 | 来源:发表于2019-10-08 16:55 被阅读0次

    给你两个长度相同的字符串,st
    s 中的第i个字符变到t中的第 i个字符需要 |s[i] - t[i]|的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。
    用于变更字符串的最大预算是maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。
    如果你可以将 s的子字符串转化为它在 t中对应的子字符串,则返回可以转化的最大长度。
    如果 s 中没有子字符串可以转化成t中对应的子字符串,则返回 0。

    示例1

    输入:s = "abcd", t = "bcdf", cost = 3
    输出:3
    解释:s 中的 "abc" 可以变为 "bcd"。开销为 3,所以最大长度为 3。

    示例2

    输入:s = "abcd", t = "cdef", cost = 3
    输出:1
    解释:s 中的任一字符要想变成 t 中对应的字符,其开销都是 2。因此,最大长度为 1。

    在做该题时,有两点需要注意:

    1. 题中的子字符串指的是连续的最长子字符串。
    2. 题目有时间限制,不能直接暴力求解。

    在使用滑动窗口时,考虑当窗口滑动到从ji 的区间时,已达到最大的cost了,当i往右移动了一个时,因为有maxCost的限制, 所以j在往右滑动时,需要滑动窗口值累计大于abs(s[i] - t[i])。以示例1为证,当i=2,j=0时,cost已达到3,这时i往右移动到3,abs(s[3]-t[3]) = 2,因此j需要移动到j=2的位置,才能使得当前滑动窗口满足不大于maxCost的条件。这样做也避免了从每一个字符都遍历一次的计算。

    class Solution {
    public:
        int equalSubstring(string s, string t, int maxCost) {
            int length=s.length();
            int i=0;int j=i;
            int maxlength=0;
            int cost=maxCost;
            while (i!=length){
                if(abs(s[i]-t[i])>cost){
                    if(i-j>maxlength) maxlength=i-j;
                    cost=abs(s[j]-t[j])+cost;
                    j++;
                }else {
                    cost=cost-abs(s[i]-t[i]);
                    i++;
                }
            }
            if(i-j>maxlength) maxlength=i-j;
            return maxlength;
            
        }
    };
    

    题目链接:https://leetcode-cn.com/problems/get-equal-substrings-within-budget

    相关文章

      网友评论

          本文标题:leetcode尽可能使字符串相等 -- 滑动窗口

          本文链接:https://www.haomeiwen.com/subject/ghxypctx.html