LeetCode 500. 键盘行

目录结构

1.题目

2.题解


1.题目

给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。

American keyboard

示例:

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

注意:

  1. 你可以重复使用键盘上同一字符。
  2. 你可以假设输入的字符串将只包含字母。

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

2.题解

  • 由于字符串只包含字母,只可能出现在三行中的一行,且第一行字母最多,故可只存储第二、三行;
  • 对于每个word,判断其字符是否来自同一行(一旦有两个字符来自不同行,即可结束),将来自同一行的加到结果集。
public class Solution500 {

    @Test
    public void test500() {
        String[] words = {"Hello", "Alaska", "Dad", "Peace"};
        System.out.println(Arrays.toString(findWords(words)));
    }

    public String[] findWords(String[] words) {
        String[] result = new String[words.length];
        int p = 0, flag, line;
        for (String w : words) {
            flag = 1;
            line = getLineNumber(String.valueOf(w.charAt(0)));
            for (int i = 1; i < w.length(); i++) {
                if (line != getLineNumber(String.valueOf(w.charAt(i)))) {
                    flag = 0;
                    break;
                }
            }
            if (flag == 1) {
                result[p++] = w;
            }
        }
        return Arrays.copyOfRange(result, 0, p);
    }

    public int getLineNumber(String s) {
        String[] lines = {
                "asdfghjklASDFGHJKL",
                "zxcvbnmZXCVBNM"
        };
        return lines[0].contains(s) ? 2 : lines[1].contains(s) ? 3 : 1;
    }
}
  • 时间复杂度:O(mn)
  • 空间复杂度:O(mn)

你可能感兴趣的:(LeetCode,leetcode)