返回

算法趣话:用差分数组轻松应对 LeetCode 2381. Shifting Letters II

后端

前言

大家好,我是你们的老朋友——算法小能手!今天,我想和大家分享一道有趣的 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 的值。

差分数组的魅力

差分数组是一个巧妙的数据结构,它记录了相邻元素之间的差值。利用差分数组,我们可以快速地更新数组元素的值,而无需遍历整个数组。在解决这道题目时,差分数组将发挥关键作用。

算法步骤

  1. 创建差分数组 :首先,我们需要创建一个与原数组等长的差分数组 diffdiff[i] 存储的是 s[i]s[i-1] 之间的差值。

  2. 应用移位操作 :接下来,我们根据给定的 shifts 数组,对 diff 数组进行循环更新。对于 shifts[i],我们将 diff[i] 加上 shifts[i],表示将 s[i] 向右移动了 shifts[i] 个位置。

  3. 还原原数组 :最后,我们通过差分数组 diff 还原出移位后的原数组 ss[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"

总结

通过这道题目,我们不仅领略了算法之美,也见识了差分数组的强大之处。差分数组作为一种灵活而高效的数据结构,在算法竞赛和编程面试中都有着广泛的应用。希望今天的分享能够帮助大家更深入地理解差分数组的应用,并激发大家对算法的兴趣。

最后,感谢大家的阅读,我们下期再见!