返回

征服 LeetCode 1165:单行键盘

闲谈

准备好了,朋友们!让我们一起踏上解决 LeetCode 1165:单行键盘的精彩旅程。这道题有趣且极具挑战性,它要求我们在仅有一行键的特殊键盘上输入单词。

深入谜题

我们有一个键盘,其键位按照一个特定的字符串排列。目标是输入一个单词,每次只能按下相邻的键位。然而,我们允许在单词之间移动。

算法的艺术

解决此问题的关键在于动态规划。我们定义一个状态 dp[i],其中 i 是输入单词的当前索引。dp[i] 表示从单词开头输入到索引 i 的最小移动次数。

我们可以通过以下方式计算 dp[i]:

  1. 基础情况: dp[0] = 0
  2. 递归关系:
    • 如果当前字符与键盘上 i 位置的字符相同,则 dp[i] = dp[i-1]
    • 否则,我们找到键盘上当前字符的最近位置,并计算从 i-1 到该位置的移动次数。然后,将该值与 dp[i-1] 相加,得到 dp[i]

代码实例

def min_moves(keyboard: str, word: str) -> int:
    n = len(word)
    dp = [float('inf')] * (n+1)
    dp[0] = 0

    for i in range(1, n+1):
        prev = dp[i-1]
        for j in range(len(keyboard)):
            if keyboard[j] == word[i-1]:
                dp[i] = min(dp[i], prev)
            else:
                dist = abs(j - keyboard.index(word[i-1]))
                dp[i] = min(dp[i], prev + dist)

    return dp[n]

示例代码

对于 keyboard = "abcdefghijklmnopqrstuvwxyz" 和 word = "cba",上面的代码将返回 4。

技术指南

  1. 输入键盘布局:
keyboard = input("输入键盘布局:")
  1. 输入单词:
word = input("输入单词:")
  1. 调用算法:
moves = min_moves(keyboard, word)
  1. 打印结果:
print(f"输入单词到单行键盘的最小移动次数:{moves}")

创新元素

  • 探索其他优化算法,例如贪心算法或 A* 搜索。
  • 考虑处理特殊字符或重复字符的情况。
  • 提供一个交互式界面,允许用户输入键盘布局和单词,并实时显示结果。

掌握了这道题的精髓,相信你已经成为单行键盘输入的大师。继续征服 LeetCode 的挑战,提高你的算法技能,踏上编程的巅峰!