zoukankan      html  css  js  c++  java
  • 【leetcode】1208. Get Equal Substrings Within Budget

    题目如下:

    You are given two strings s and t of the same length. You want to change s to t. Changing the i-th character of s to i-th character of t costs |s[i] - t[i]| that is, the absolute difference between the ASCII values of the characters.

    You are also given an integer maxCost.

    Return the maximum length of a substring of s that can be changed to be the same as the corresponding substring of twith a cost less than or equal to maxCost.

    If there is no substring from s that can be changed to its corresponding substring from t, return 0.

    Example 1:

    Input: s = "abcd", t = "bcdf", maxCost = 3
    Output: 3
    Explanation: "abc" of s can change to "bcd". That costs 3, so the maximum length is 3.

    Example 2:

    Input: s = "abcd", t = "cdef", maxCost = 3
    Output: 1
    Explanation: Each character in s costs 2 to change to charactor in t, so the maximum length is 1.
    

    Example 3:

    Input: s = "abcd", t = "acde", maxCost = 0
    Output: 1
    Explanation: You can't make any change, so the maximum length is 1. 

    Constraints:

    • 1 <= s.length, t.length <= 10^5
    • 0 <= maxCost <= 10^6
    • s and t only contain lower case English letters.

    解题思路:本题包了一层壳,去掉外表后题目是给定一个正整数组成的数组,求出最长的一段子数组的长度,要求子数组的和不大于cost。解题方法也不难,记per_cost[i]为abs(s[i] - t[i])的值,cost[i]为sum(per_cost[0:i])的值。对于任意一个下标i,很容易通过二分查找的方法找出cost中另外一个下标j,使得cost[i:j] <= cost。

    代码如下:

    class Solution(object):
        def equalSubstring(self, s, t, maxCost):
            """
            :type s: str
            :type t: str
            :type maxCost: int
            :rtype: int
            """
            cost = []
            amount = 0
            per_cost = []
            for cs,ct in zip(s,t):
                amount += abs(ord(cs) - ord(ct))
                cost.append(amount)
                per_cost.append(abs(ord(cs) - ord(ct)))
            #cost.sort()
            #print cost
            #print per_cost
            import bisect
            res = -float('inf')
            for i in range(len(cost)):
                inx = bisect.bisect_right(cost,cost[i] + maxCost - per_cost[i])
                res = max(res,inx - i)
            return res
  • 相关阅读:
    guzzle下载图片(laravel+vue)
    leetcode——131.分割回文串
    leetcode——139.单词拆分
    leetcode——115.不同的子序列
    leetcode——72.编辑距离
    leetcode——87.扰乱字符串
    leetcode——123. 买卖股票的最佳时机 III
    leetcode——132. 分割回文串 II
    leetcode——124. 二叉树中的最大路径和
    leetcode——51.N皇后
  • 原文地址:https://www.cnblogs.com/seyjs/p/11616703.html
Copyright © 2011-2022 走看看