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

13 阅读3分钟

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

alt text
在编程的世界里,算法题目总是充满了趣味和挑战。今天,我们要来聊聊 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

解题思路

要解决这个问题,我们可以按照以下步骤进行:

  1. 初始化距离矩阵:创建一个 26x26 的二维数组 distances,用于存储键盘上每个字符之间的距离。
  2. 计算字符之间的距离:遍历键盘字符串,计算每对字符之间的距离,并将其存储在 distances 矩阵中。
  3. 初始化结果和前一个字符的位置:将结果 res 初始化为 0,并将 prev 初始化为键盘字符串的第一个字符的位置。
  4. 计算输入单词的总时间:遍历单词字符串,对于每个字符,计算从前一个字符到当前字符的距离,并将其累加到 res 中。更新 prev 为当前字符的位置。
  5. 返回结果:返回累加的总时间 res

代码实现

package _1165;

public class LeetCode1165 {

    public int calculateTime(String keyboard, String word) {
        int[][] distances = new int[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++) {
                int to = 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;
    }

    public static void main(String[] args) {
        LeetCode1165 solution = new LeetCode1165();
        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
    }
}

总结

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

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