在编程的世界里,算法题目总是充满了趣味和挑战。今天,我们要来聊聊 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
}
}
总结
通过上述步骤和代码实现,我们可以轻松地计算出在单行键盘上输入一个字符串所需的时间。这个问题不仅考察了我们对字符串和数组的操作能力,还帮助我们更好地理解了如何通过预处理(如计算距离矩阵)来优化算法的性能。
希望这篇文章能帮助你更好地理解和解决这个问题。如果你有任何疑问或建议,欢迎在评论区留言。让我们一起在编程的道路上不断进步!
共同学习,写下你的评论
评论加载中...
作者其他优质文章