返回
征服 LeetCode 1165:单行键盘
闲谈
2023-09-03 11:56:33
准备好了,朋友们!让我们一起踏上解决 LeetCode 1165:单行键盘的精彩旅程。这道题有趣且极具挑战性,它要求我们在仅有一行键的特殊键盘上输入单词。
深入谜题
我们有一个键盘,其键位按照一个特定的字符串排列。目标是输入一个单词,每次只能按下相邻的键位。然而,我们允许在单词之间移动。
算法的艺术
解决此问题的关键在于动态规划。我们定义一个状态 dp[i],其中 i 是输入单词的当前索引。dp[i] 表示从单词开头输入到索引 i 的最小移动次数。
我们可以通过以下方式计算 dp[i]:
- 基础情况: dp[0] = 0
- 递归关系:
- 如果当前字符与键盘上 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。
技术指南
- 输入键盘布局:
keyboard = input("输入键盘布局:")
- 输入单词:
word = input("输入单词:")
- 调用算法:
moves = min_moves(keyboard, word)
- 打印结果:
print(f"输入单词到单行键盘的最小移动次数:{moves}")
创新元素
- 探索其他优化算法,例如贪心算法或 A* 搜索。
- 考虑处理特殊字符或重复字符的情况。
- 提供一个交互式界面,允许用户输入键盘布局和单词,并实时显示结果。
掌握了这道题的精髓,相信你已经成为单行键盘输入的大师。继续征服 LeetCode 的挑战,提高你的算法技能,踏上编程的巅峰!