【LeetCode】键盘行Java题解

388 阅读2分钟

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

题目描述

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。

美式键盘 中:

第一行由字符 "qwertyuiop" 组成。 第二行由字符 "asdfghjkl" 组成。 第三行由字符 "zxcvbnm" 组成。

示例 1:

输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]

示例 2:

输入:words = ["omk"]
输出:[]

示例 3:

输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/keyboard-row
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法每日一题是字符串数组处理题目,题意简单明了。
  • 整体思路是为每一个英文字母标记其对应键盘上的行号,然后检测字符串中所有字符对应的行号是否相同。
  • 在实现代码中,首先预处理计算出每个字符对应的行号。这里可以采用 ASCII 码的知识,ASCII 码是最通用的信息交换标准。简单理解就是将字符转换成数字记录。方便后续使用,快速判断字符属于哪一行。
  • 在代码执行的细节中,由于同一字母的大写字母,小写字母都对应的是同一个键盘位置,我们可以简化操作,统一转换成小写字母进行判断。具体实现如下:

通过代码

class Solution {
    public String[] findWords(String[] words) {
        String[] temp = new String[]{"qwertyuiop","asdfghjkl","zxcvbnm"};
        int[] chars = new int[26];
        int i = 1;
        for (String s : temp) {
            for (char c : s.toCharArray()) {
                chars[c - 'a'] = i;
            }
            i++;
        }
        

        List<String> list = new ArrayList<>();

        for (String word : words) {
            int j = -1;
            boolean flag = true;
            for (char wordChar : word.toCharArray()) {
                wordChar = Character.toLowerCase(wordChar);
                if (j == -1) {
                    j = chars[wordChar - 'a'];
                } else if (j != chars[wordChar - 'a']) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                list.add(word);
            }
        }


        String[] ans = new String[list.size()];
        for (int k = 0; k < list.size(); k++) {
            ans[k] = list.get(k);
        }

        return ans;
    }
}

image.png

总结

  • 上述算法的时间复杂度是O(n * n), 空间复杂度是O(n)
  • 今天的每日一题题目简单明了,但是实际实现,并且通过测试,大家可以实际尝试一下。纸上得来终觉浅,绝知此事要躬行!多多写代码,才有助于我们更好的提高!
  • 坚持算法每日一题,加油!