Problem
You are given two strings s
and t
of the same length and an integer maxCost
.
You want to change s
to t
. Changing the ith
character of s
to ith
character of t
costs |s[i] - t[i]|
(i.e., the absolute difference between the ASCII values of the characters).
Return the maximum length of a substring of s
that can be changed to be the same as the corresponding substring of t
with 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
.
Examples
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 character in t, so the maximum length is 1.
Example 3:
Input: s = "abcd", t = "acde", maxCost = 0
Output: 1
Explanation: You cannot make any change, so the maximum length is 1.
Solution
Method 1 - Sliding Window
Assume we have a window bound by left
and right
. We will track currCost
to see if are using the maxCost
optimally. We will extend the right boundary, and update the current cost, and keep on extending it, till the current cost has overrun the max cost.
Now, when we overrun the max cost, we shrink the window from left, because we have already seen those elements.
At any time, we will keep track of max length of window, because that is the max length of the substring, which we need as output.
Video explanation
Here is the video explaining this method in detail. Please check it out:
Code
Java
class Solution {
public int equalSubstring(String s, String t, int maxCost) {
int n = s.length();
int ans = 0, currCost = 0, left = 0;
for (int right = 0; right < n; right++) {
currCost += Math.abs(s.charAt(right) - t.charAt(right));
while (currCost > maxCost) {
currCost -= Math.abs(s.charAt(left) - t.charAt(left));
left++;
}
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}
Complexity
- ⏰ Time complexity:
O(n)
- 🧺 Space complexity:
O(1)