算法趣话:用差分数组轻松应对 LeetCode 2381. Shifting Letters II
2023-12-07 21:12:02
前言
大家好,我是你们的老朋友——算法小能手!今天,我想和大家分享一道有趣的 LeetCode 题目——2381. Shifting Letters II,同时带大家领略差分数组的独特魅力。这道题主要考察我们对差分数组的灵活应用,让我们一起探索算法的奥妙吧!
题目概述
LeetCode 2381. Shifting Letters II 题目如下:
给你一个字符串 s
和一个整数数组 shifts
。
每次 move
操作将 s
中的每个字符向右移动一个位置。s
的末尾字符移到 s
的开头。
你将 shifts
中的每个值 循环 地应用到 s
中。
例如,如果你有 s = "abc"
, shifts = [0,1,2]
, 第一次 move
操作将 s
变为 "bca"
,第二次操作变为 "cab"
,第三次操作变为 "abc"
。
最后,返回移位后 s
的值。
差分数组的魅力
差分数组是一个巧妙的数据结构,它记录了相邻元素之间的差值。利用差分数组,我们可以快速地更新数组元素的值,而无需遍历整个数组。在解决这道题目时,差分数组将发挥关键作用。
算法步骤
-
创建差分数组 :首先,我们需要创建一个与原数组等长的差分数组
diff
,diff[i]
存储的是s[i]
和s[i-1]
之间的差值。 -
应用移位操作 :接下来,我们根据给定的
shifts
数组,对diff
数组进行循环更新。对于shifts[i]
,我们将diff[i]
加上shifts[i]
,表示将s[i]
向右移动了shifts[i]
个位置。 -
还原原数组 :最后,我们通过差分数组
diff
还原出移位后的原数组s
。s[0]
等于diff[0]
,s[i]
等于s[i-1] + diff[i]
。
代码实现
def shifting_letters(s, shifts):
# 创建差分数组
diff = [0] * len(s)
for i in range(1, len(s)):
diff[i] = ord(s[i]) - ord(s[i-1])
# 应用移位操作
for i in range(len(shifts)):
diff[i] += shifts[i]
# 还原原数组
s = ""
s += chr(ord(s[0]) + diff[0])
for i in range(1, len(s)):
s += chr(ord(s[i-1]) + diff[i])
return s
# 测试用例
s = "abc"
shifts = [0,1,2]
print(shifting_letters(s, shifts)) # 输出: "cab"
s = "abc"
shifts = [3,5,9]
print(shifting_letters(s, shifts)) # 输出: "rpl"
总结
通过这道题目,我们不仅领略了算法之美,也见识了差分数组的强大之处。差分数组作为一种灵活而高效的数据结构,在算法竞赛和编程面试中都有着广泛的应用。希望今天的分享能够帮助大家更深入地理解差分数组的应用,并激发大家对算法的兴趣。
最后,感谢大家的阅读,我们下期再见!