力扣1208. 儘可能使字符串相等

給你兩個長度相同的字符串,s 和 t。

將 s 中的第 i 個字符變到 t 中的第 i 個字符需要 |s[i] - t[i]| 的開銷(開銷可能爲 0),也就是兩個字符的 ASCII 碼值的差的絕對值。

用於變更字符串的最大預算是 maxCost。在轉化字符串時,總開銷應當小於等於該預算,這也意味着字符串的轉化可能是不完全的。

如果你可以將 s 的子字符串轉化爲它在 t 中對應的子字符串,則返回可以轉化的最大長度。

如果 s 中沒有子字符串可以轉化成 t 中對應的子字符串,則返回 0。

 

示例 1:

輸入:s = "abcd", t = "bcdf", cost = 3
輸出:3
解釋:s 中的 "abc" 可以變爲 "bcd"。開銷爲 3,所以最大長度爲 3。
示例 2:

輸入:s = "abcd", t = "cdef", cost = 3
輸出:1
解釋:s 中的任一字符要想變成 t 中對應的字符,其開銷都是 2。因此,最大長度爲 1。
示例 3:

輸入:s = "abcd", t = "acde", cost = 0
輸出:1
解釋:你無法作出任何改動,所以最大長度爲 1。
 

提示:

1 <= s.length, t.length <= 10^5
0 <= maxCost <= 10^6
s 和 t 都只含小寫英文字母。

題解:

算法:滑動窗口

滑動窗口,顧名思義,在兩個指針存在的情況下向右滑動,在條件的限制下縮小放大窗口。

定義兩個指針left、right,cost爲目前需要的開銷,result記錄結果。

class Solution {
public:
    int equalSubstring(string s, string t, int maxCost) {
        int left=0,right=0,cost=0,result=0,n=s.size();
	while(right<n)//固定窗口的邊界
	{
		cost+=abs(s[right]-t[right]);
		while(cost>maxCost)//窗口溢出,需要縮小窗口
		{
			cost-=abs(s[left]-t[left]);
			left++;
		}
		result=max(result,right-left+1);//窗內中cost小於等於maxCost時,我們需要記錄最長的子字符串
		right++;
	}
	
	return result;
    }
};

 

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