leetcode 1208 盡可能使字串相等

2021-10-19 04:03:05 字數 1987 閱讀 3193

目錄

一、題目內容

二、解題思路

三、**

給你兩個長度相同的字串,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 都只含小寫英文本母。

滑動視窗,先計算各個對應位置的字母ascii碼的差值,然後從左到右累計開銷,如果大於最大開銷,則視窗左端右移,並減去原始左端的開銷,同時更新最大長度。最後再次更新最大長度即可。

class solution:

def equalsubstring(self, s: str, t: str, maxcost: int) -> int:

n = len(s)

diff =

for right in range(n):

left, right = 0, 0

sums = 0

max_length = 0

for right in range(n):

sums += diff[right]

while sums > maxcost:

max_length = max(max_length, right - left)

sums -= diff[left]

left += 1

max_length = max(max_length, right - left + 1)

return max_length

if __name__ == '__main__':

ss = solution()

# s = "abcd"

# t = "cdef"

# cost = 3

# s = "abcd"

# t = "bcdf"

# cost = 3

s = "abcd"

t = "bcdf"

cost = 3

ans = ss.equalsubstring(s, t, cost)

print(ans)

leetCode 1208 盡可能使字串相等

字串s與t每乙個對應字元的開銷為 s i s t s i s t s i s t 因此可以構建乙個diff陣列其中dif f i s i s t diff i s i s t diff i s i s t 這樣問題就轉化成了在diff陣列中求區間和不超過maxcost的最長區間長度。使用雙指標維護乙...

LeetCode 1208 盡可能使字串相等

題目描述 給你兩個長度相同的字串,s 和 t。將 s 中的第 i 個字元變到 t 中的第 i 個字元需要 s i t i 的開銷 開銷可能為 0 也就是兩個字元的 ascii 碼值的差的絕對值。用於變更字串的最大預算是 maxcost。在轉化字串時,總開銷應當小於等於該預算,這也意味著字串的轉化可能...

LeetCode 1208 盡可能使字串相等

可以通過滑動視窗轉化為乙個最長序列求和問題,旨在在指定值下,找到總和小於該值的最長序列 如果使用dp動態規劃,但是會超時 class solution for int i 0 i len i for int i 0 i len 1 i for int l 2 l len l return maxn ...