今日题目
https://leetcode.com/problems/shifting-letters-ii/description/
解题思路
我们需要构建一种数据结构,支持多次区间加法操作和一次性查询。因此,可以使用差分数组与前缀和来解决。
解题方法
在差分数组中,我们只记录变化区间边界处的差值。例如,对区间 $[l,r]$ 整体加 $k$,只需关注 $l$ 和 $r$ 两个端点:将差分数组 $diff[l]$ 加 $k$,再将 $diff[r+1]$ 加 $-k$。这样,对差分数组求前缀和 $s$ 后,加 $k$ 的效果只会体现在 $[l,r]$ 范围内。因此,利用差分数组与前缀和,每次区间修改的时间复杂度为 $O(1)$。
在处理字符移位时,先将字符转换为 ASCII 码,减去字符 ‘a’ 的 ASCII 码,再对 26 取模,即可实现字符的"循环移位"效果。
复杂度分析
-
时间复杂度:$O(N + C)$,其中 N 为字符串长度,C 为操作次数。
-
空间复杂度:$O(N)$,需要存储差分数组。
代码
class Solution:
def shiftingLetters(self, s: str, shifts: List[List[int]]) -> str:
dif = [0] * (len(s) + 1)
for l,r,delta in shifts:
if delta == 0:
dif[l] -= 1
dif[r + 1] += 1
else:
dif[l] += 1
dif[r + 1] -= 1
a = ord('a')
cnt = 0
ans = ""
for i in range(len(s)):
cnt += dif[i]
ans += chr((ord(s[i]) - a + cnt) % 26 + a)
return ans