- 标签:字符串、二分查找、前缀和、滑动窗口
- 难度:中等
描述:给定两个长度相同的字符串,$s$ 和
要求:如果你可以将
说明:
-
$1 \le s.length, t.length \le 10^5$ 。 -
$0 \le maxCost \le 10^6$ 。 -
$s$ 和$t$ 都只含小写英文字母。
示例:
- 示例 1:
输入:s = "abcd", t = "bcdf", maxCost = 3
输出:3
解释:s 中的 "abc" 可以变为 "bcd"。开销为 3,所以最大长度为 3。
- 示例 2:
输入:s = "abcd", t = "cdef", maxCost = 3
输出:1
解释:s 中的任一字符要想变成 t 中对应的字符,其开销都是 2。因此,最大长度为 1。
维护一个滑动窗口
使用两个指针
- 先统计出
$s$ 中第$i$ 个字符变为$t$ 的第$i$ 个字符的开销,用数组$costs$ 保存。 - 一开始,$left$、$right$ 都指向
$0$ 。 - 将最右侧字符的转变开销填入窗口中,向右移动
$right$ 。 - 直到窗口内开销总和
$window\underline{\hspace{0.5em}}sum$ 大于$maxCost$ 。则不断右移$left$ ,缩小窗口长度。直到$window\underline{\hspace{0.5em}}sum \le maxCost$ 时,更新可以转换的最大长度$ans$ 。 - 向右移动
$right$ ,直到$right \ge len(s)$ 为止。 - 输出答案
$ans$ 。
class Solution:
def equalSubstring(self, s: str, t: str, maxCost: int) -> int:
size = len(s)
costs = [0 for _ in range(size)]
for i in range(size):
costs[i] = abs(ord(s[i]) - ord(t[i]))
left, right = 0, 0
ans = 0
window_sum = 0
while right < size:
window_sum += costs[right]
while window_sum > maxCost:
window_sum -= costs[left]
left += 1
ans = max(ans, right - left + 1)
right += 1
return ans
- 时间复杂度:
- 空间复杂度: