题目描述#
给定一个由小写字母组成的字符串 s,以及一个同长度整数数组 shifts。
对于每个 shifts[i] = x,将 s 的前 i+1 个字符整体向后移位 x 次(字母表循环,z -> a)。
求应用全部移位操作后的最终字符串。
知识边界#
这题的核心是前缀影响的反向累加(也可理解为后缀和思路):
shifts[i]会影响区间[0..i]- 对每个位置
i来说,它实际要加上的总位移,是shifts[i] + shifts[i+1] + ... + shifts[n-1] - 因此从右往左做累加,得到每个位置的总位移即可
代码中使用 backfix(长度 n+1)存储这个“从右向左的累计位移”,并对 26 取模,避免数值过大。
时间复杂度:O(n)
空间复杂度:O(n)(backfix 数组)
代码#
func shiftingLetters(s string, shifts []int) string {
backfix := make([]int, len(shifts)+1)
for i := len(shifts) - 1; i >= 0; i-- {
backfix[i] = (backfix[i+1] + shifts[i]) % 26
}
res := []byte(s)
for i := 0; i < len(backfix)-1; i++ {
res[i] = byte((int(res[i]-'a')+backfix[i])%26 + 'a')
}
return string(res)
}