题目描述#

给定一个由小写字母组成的字符串 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)
}
本站总访问量  ·  访客数
你的IP 获取中…