在编程的世界里,算法题目总是充满了趣味和挑战。今天,我们要来聊聊 LeetCode 上的第 1165 题——单行键盘。这道题不仅有趣,还能帮助我们更好地理解字符串操作和数组的应用。让我们一起来看看如何用 Java 解决这个问题。
题目描述了一个有趣的场景:我们有一款特殊的键盘,所有的键都排列在一行上。给定一个长度为 26 的字符串 keyboard
,表示键盘的布局(索引从 0 到 25)。一开始,手指在索引 0 处。要输入一个字符,必须把手指移动到所需字符的索引处。手指从索引 i 移动到索引 j 所需的时间是 |i - j|。
我们需要写一个函数来计算用一个手指输入一个字符串 word
所需的时间。
示例 1:
输入:keyboard = "abcdefghijklmnopqrstuvwxyz"
, word = "cba"
输出:4
解释:从 0 号键移动到 2 号键来输出 ‘c’,又移动到 1 号键来输出 ‘b’,接着移动到 0 号键来输出 ‘a’。总用时 = 2 + 1 + 1 = 4.
示例 2:
输入:keyboard = "pqrstuvwxyzabcdefghijklmno"
, word = "leetcode"
输出:73
要解决这个问题,我们可以按照以下步骤进行:
初始化距离矩阵
:创建一个 26x26 的二维数组 distances
,用于存储键盘上每个字符之间的距离。
计算字符之间的距离
:遍历键盘字符串,计算每对字符之间的距离,并将其存储在 distances
矩阵中。
初始化结果和前一个字符的位置
:将结果 res
初始化为 0,并将 prev
初始化为键盘字符串的第一个字符的位置。
计算输入单词的总时间
:遍历单词字符串,对于每个字符,计算从前一个字符到当前字符的距离,并将其累加到 res
中。更新 prev
为当前字符的位置。
返回结果
:返回累加的总时间 res
。
package _1165; publicclassLeetCode1165{ publicintcalculateTime(String keyboard,String word){ int[][] distances =newint[26][26]; for(int i =0; i < keyboard.length(); i++){ int from = keyboard.charAt(i)-'a'; for(int j = i +1; j < keyboard.length(); j++){ intto= keyboard.charAt(j)-'a'; distances[from][to]= j - i; distances[to][from]= j - i; } } int res =0; int prev = keyboard.charAt(0)-'a'; for(int i =0; i < word.length(); i++){ int next = word.charAt(i)-'a'; res += distances[prev][next]; prev = next; } return res; } publicstaticvoidmain(String[] args){ LeetCode1165 solution =newLeetCode1165(); String keyboard ="abcdefghijklmnopqrstuvwxyz"; String word ="cba"; System.out.println("输入: keyboard = \""+ keyboard +"\", word = \""+ word +"\""); System.out.println("输出: "+ solution.calculateTime(keyboard, word));// 输出: 4 keyboard ="pqrstuvwxyzabcdefghijklmno"; word ="leetcode"; System.out.println("输入: keyboard = \""+ keyboard +"\", word = \""+ word +"\""); System.out.println("输出: "+ solution.calculateTime(keyboard, word));// 输出: 73 } }
通过上述步骤和代码实现,我们可以轻松地计算出在单行键盘上输入一个字符串所需的时间。这个问题不仅考察了我们对字符串和数组的操作能力,还帮助我们更好地理解了如何通过预处理(如计算距离矩阵)来优化算法的性能。
希望这篇文章能帮助你更好地理解和解决这个问题。如果你有任何疑问或建议,欢迎在评论区留言。让我们一起在编程的道路上不断进步!