单行键盘:用Java解决键盘输入时间问题

东百牧码人 2025-01-10 14:49:21

在编程的世界里,算法题目总是充满了趣味和挑战。今天,我们要来聊聊 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(Stringkeyboard,Stringword){int[][]distances=newint[26][26];for(inti=0;i<keyboard.length();i++){intfrom=keyboard.charAt(i)-'a';for(intj=i+1;j<keyboard.length();j++){intto=keyboard.charAt(j)-'a';distances[from][to]=j-i;distances[to][from]=j-i;}}intres=0;intprev=keyboard.charAt(0)-'a';for(inti=0;i<word.length();i++){intnext=word.charAt(i)-'a';res+=distances[prev][next];prev=next;}returnres;}publicstaticvoidmain(String[]args){LeetCode1165solution=newLeetCode1165();Stringkeyboard="abcdefghijklmnopqrstuvwxyz";Stringword="cba";System.out.println("输入: keyboard = \""+keyboard+"\", word = \""+word+"\"");System.out.println("输出: "+solution.calculateTime(keyboard,word));// 输出: 4keyboard="pqrstuvwxyzabcdefghijklmno";word="leetcode";System.out.println("输入: keyboard = \""+keyboard+"\", word = \""+word+"\"");System.out.println("输出: "+solution.calculateTime(keyboard,word));// 输出: 73}}

总结

通过上述步骤和代码实现,我们可以轻松地计算出在单行键盘上输入一个字符串所需的时间。这个问题不仅考察了我们对字符串和数组的操作能力,还帮助我们更好地理解了如何通过预处理(如计算距离矩阵)来优化算法的性能。

希望这篇文章能帮助你更好地理解和解决这个问题。如果你有任何疑问或建议,欢迎在评论区留言。让我们一起在编程的道路上不断进步!

0 阅读:6