1. 滑动窗口
滑动窗口从左侧开始在满足cost的情况下向右滑动,记录最大窗口大小。
当cost不足以支持窗口继续向右扩展时,左侧窗口向右收缩1次,然后右侧窗口继续向右扩展。
时间O(n)
,空间O(1)
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: int equalSubstring(string s, string t, int maxCost) { int n = s.length(); int left = 0, right = 0, maxDist = 0;
while (right < n) { int cost = abs(s[right] - t[right]); if (cost <= maxCost) { maxCost -= cost; right++; maxDist = max(maxDist, right - left); } else if (left < right) { maxCost += abs(s[left] - t[left]); left++; } else if (left == right) { left++; right++; } }
return maxDist; } };
|