給你兩個長度相同的字符串,
s和t。
將s中的第i個字符變到t中的第i個字符需要|s[i] - t[i]|的開銷(開銷可能為 0),也就是兩個字符的 ASCII 碼值的差的絕對值。
用于變更字符串的最大預算是maxCost。在轉(zhuǎn)化字符串時,總開銷應當小于等于該預算,這也意味著字符串的轉(zhuǎn)化可能是不完全的。
如果你可以將s的子字符串轉(zhuǎn)化為它在t中對應的子字符串,則返回可以轉(zhuǎn)化的最大長度。
如果s中沒有子字符串可以轉(zhuǎn)化成t中對應的子字符串,則返回 0。
示例1
輸入:s = "abcd", t = "bcdf", cost = 3
輸出:3
解釋:s 中的 "abc" 可以變?yōu)?"bcd"。開銷為 3,所以最大長度為 3。
示例2
輸入:s = "abcd", t = "cdef", cost = 3
輸出:1
解釋:s 中的任一字符要想變成 t 中對應的字符,其開銷都是 2。因此,最大長度為 1。
在做該題時,有兩點需要注意:
- 題中的子字符串指的是連續(xù)的最長子字符串。
- 題目有時間限制,不能直接暴力求解。
在使用滑動窗口時,考慮當窗口滑動到從j 到 i 的區(qū)間時,已達到最大的cost了,當i往右移動了一個時,因為有maxCost的限制, 所以j在往右滑動時,需要滑動窗口值累計大于abs(s[i] - t[i])。以示例1為證,當i=2,j=0時,cost已達到3,這時i往右移動到3,abs(s[3]-t[3]) = 2,因此j需要移動到j=2的位置,才能使得當前滑動窗口滿足不大于maxCost的條件。這樣做也避免了從每一個字符都遍歷一次的計算。
class Solution {
public:
int equalSubstring(string s, string t, int maxCost) {
int length=s.length();
int i=0;int j=i;
int maxlength=0;
int cost=maxCost;
while (i!=length){
if(abs(s[i]-t[i])>cost){
if(i-j>maxlength) maxlength=i-j;
cost=abs(s[j]-t[j])+cost;
j++;
}else {
cost=cost-abs(s[i]-t[i]);
i++;
}
}
if(i-j>maxlength) maxlength=i-j;
return maxlength;
}
};
題目鏈接:https://leetcode-cn.com/problems/get-equal-substrings-within-budget