难度:★★☆☆☆
类型:数组
方法:抓重点
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
题目
有一个由小写字母组成的字符串 S,和一个整数数组 shifts。
我们将字母表中的下一个字母称为原字母的 移位(由于字母表是环绕的, 'z' 将会变成 'a')。
例如·,shift('a') = 'b', shift('t') = 'u',, 以及 shift('z') = 'a'。
对于每个 shifts[i] = x , 我们会将 S 中的前 i+1 个字母移位 x 次。
返回将所有这些移位都应用到 S 后最终得到的字符串。
示例:
输入:S = "abc", shifts = [3,5,9]
输出:"rpl"
解释:
我们以 "abc" 开始。
将 S 中的第 1 个字母移位 3 次后,我们得到 "dbc"。
再将 S 中的前 2 个字母移位 5 次后,我们得到 "igc"。
最后将 S 中的这 3 个字母移位 9 次后,我们得到答案 "rpl"。
提示:
1 <= S.length = shifts.length <= 20000
0 <= shifts[i] <= 10 ^ 9
解答
这道题很简单,重点在于提炼核心算法避免重复超时。
我们定义一个函数get_shift_result,用于计算一个字母c位移s次后可以得到的字母,这个函数中要注意的是“a”的ASCII码是从9开始,另外要灵活运用取余来解决旋转问题。
再定义一个函数get_shifts,用于获取最后的偏移量列表shifts,例如题目中的shifts为[1,2,3]实际上意味着对应位置处的字母总位移次数为[6,5,3]次,这里要巧妙使用逆序进行处理。
最后,我们把每个字母按顺序拆分,处理,合并即可。
class Solution:
def shiftingLetters(self, S, shifts):
def get_shift_result(c, s):
return chr(97 + ((ord(c) + s % 26) - 97) % 26)
def get_shifts(shifts):
cur_s = 0
new_shifts = []
for s in reversed(shifts):
cur_s += s
new_shifts.append(cur_s)
return reversed(new_shifts)
return "".join(get_shift_result(c, s) for c, s in zip(S, get_shifts(shifts)))
如有疑问或建议,欢迎评论区留言~
有关更多力扣中等题的python解决方案,请移步力扣中等题解析
网友评论