友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

500. 键盘行

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

美式键盘 中:

  • 第一行由字符 qwertyuiop 组成。

  • 第二行由字符 asdfghjkl 组成。

  • 第三行由字符 zxcvbnm 组成。

0500 01

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= words.length <= 20

  • 1 <= words[i].length <= 100

  • words[i] 由英文字母(小写和大写字母)组成

思路分析

记录每行字母的下标。查看每个单词第一个字母的下标,然后再对比后续单词下标,有不一致的则出局。

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2026-02-15 23:13:50
 */
public String[] findWords(String[] words) {
  String[] lines = {"qwertyuiop", "asdfghjkl", "zxcvbnm"};
  Map<Character, Integer> charToIndex = new HashMap<>();
  for (int i = 0; i < lines.length; i++) {
    for (char c : lines[i].toCharArray()) {
      charToIndex.put(c, i);
    }
  }
  List<String> result = new ArrayList<>();
  for (String word : words) {
    boolean ok = true;
    int line = -1;
    for (char c : word.toLowerCase().toCharArray()) {
      if (line == -1) {
        line = charToIndex.get(c);
        continue;
      }
      if (charToIndex.get(c) != line) {
        ok = false;
        break;
      }
    }
    if (ok) {
      result.add(word);
    }
  }
  return result.toArray(new String[0]);
}