滑動窗口系列-Leetcode 1208. 儘可能使字符串相等

問題描述

給你兩個長度相同的字符串,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;
    }
};

參考資料

[1] Leetcode 1208. 儘可能使字符串相等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章