字串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的最長區間長度。
使用雙指標維護乙個邏輯上的視窗,不斷移動右指標,使用乙個變數sum維護當前視窗內的和,當sum > maxcost時更新sum並移動左指標和sum,最後不斷跟新答案res即可。
class
solution
int left =
0, right =0;
int sum =
0, res =0;
while
(right < n)
res = math.
max(res, right - left);}
return res;
}}
快速求得乙個連續區間的和也可以使用字首和演算法,更具diff陣列得到乙個字首和陣列sum
int
sum =
newint
[n +1]
;for
(int i =
1; i < n +
1; i++
)
我們想要找到區間 [i,
j]滿足
sum[
j+1]
−sum
[i]<=m
axco
st[i, j] 滿足sum[j + 1] - sum[i] <= maxcost
[i,j]滿
足sum
[j+1
]−su
m[i]
<=m
axco
st, 我們已經知道了區間的和要小於maxcost 所以
1
<=i
<=n
時,[0
,i−1
]區間內
的和就是
sum[
i]我們
需要找到
乙個開始
下標st
art,
使得[s
tart
,i−1
]區間的
和小於m
axco
st,也
就是su
m[i]
−sum
[sta
rt]<=m
axco
st所以
sum[
star
t]>=s
um[i
]−ma
xcos
t1<= i <= n時,[0, i- 1]區間內的和就是sum[i]我們需要找到乙個開始下標start,使得[start, i - 1]區間的和小於maxcost,也就是sum[i] - sum[start] <= maxcost 所以sum[start] >= sum[i] - maxcost
1<=i
<=n
時,[0
,i−1
]區間內
的和就是
sum[
i]我們
需要找到
乙個開始
下標st
art,
使得[s
tart
,i−1
]區間的
和小於m
axco
st,也
就是su
m[i]
−sum
[sta
rt]<=m
axco
st所以
sum[
star
t]>=s
um[i
]−ma
xcos
t,由於diff陣列都為正數,所以字首和陣列單調遞增,可以通過二分查詢來對每乙個 i
ii查詢最小的sta
rt下標
start下標
start下
標,每次查詢到的最長區間長度為i−s
tart
i - start
i−star
t, 每查詢一次更新答案res即可
class
solution
// sum陣列是單調遞增的
int res =0;
for(
int i =
1; i <= n; i++
)return res;
}int
binarysearch
(int
sum,
int end,
int target)
else
}return lo;
}}
leetcode 1208 盡可能使字串相等
目錄 一 題目內容 二 解題思路 三 給你兩個長度相同的字串,s 和 t。將 s 中的第 i 個字元變到 t 中的第 i 個字元需要 s i t i 的開銷 開銷可能為 0 也就是兩個字元的 ascii 碼值的差的絕對值。用於變更字串的最大預算是 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 ...