题目
给你两个长度相同的字符串,s 和 t。
将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。
用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。
如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。
如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。
解题思路
采用滑动窗口的思想
保证窗口只会扩张不会缩小即可,这样就无需max函数,其实使用max函数的话更像双指针的做法
当窗口内开销大于maxCost时将窗口左边界右移
其实就是相当于先判断左边界为0的最大窗口长度,在判断左边界为1的。。。以此类推
由于窗口不会缩小,最终窗口大小就是所需结果
代码
class Solution:
def equalSubstring(self, s: str, t: str, maxCost: int) -> int:
len_s = len(s)
left, right = 0, 0
total = 0
while right < len_s:
total += abs(ord(s[right])-ord(t[right]))
if total > maxCost: #核心就是这里的if
total -= abs(ord(s[left])-ord(t[left]))
left += 1
right += 1
return right - left