問題描述
給你兩個長度相同的字符串,s 和 t。
將 s 中的第 i 個字符變到 t 中的第 i 個字符需要 |s[i] - t[i]| 的開銷(開銷可能爲 0),也就是兩個字符的 ASCII 碼值的差的絕對值。
用於變更字符串的最大預算是 maxCost。在轉化字符串時,總開銷應當小於等於該預算,這也意味着字符串的轉化可能是不完全的。
如果你可以將 s 的子字符串轉化爲它在 t 中對應的子字符串,則返回可以轉化的最大長度。
如果 s 中沒有子字符串可以轉化成 t 中對應的子字符串,則返回 0。
輸入:s = “abcd”, t = “cdef”, cost = 3
輸出:1
解釋:s 中的任一字符要想變成 t 中對應的字符,其開銷都是 2。因此,最大長度爲 1。
解題報告
- 移動窗口的右邊界時,更新窗口內消耗
cost
。 - 當前
cost
大於maxCost
,移動左邊界知道窗口內的cost
小於等於maxCost
- 移動左邊界時,更新窗口內消耗
cost
。 - 左右邊界穩定時,更新最長子串
實現代碼
class Solution {
public:
int equalSubstring(string s, string t, int maxCost) {
int ans=0,l=0,r=0,tmpCost=0;
while(r<s.size()){
tmpCost+=abs(s[r]-t[r]);
while(tmpCost>maxCost){
tmpCost-=abs(s[l]-t[l]);
l++;
}
ans=max(ans, r-l+1);
r++;
}
return ans;
}
};