1. 问题描述:
给你一个字符串数组 words ,只返回可以使用在美式键盘同一行的字母打印出来的单词。键盘如下图所示。
美式键盘中:
第一行由字符 "qwertyuiop" 组成。
第二行由字符 "asdfghjkl" 组成。
第三行由字符 "zxcvbnm" 组成。
示例 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] 由英文字母(小写和大写字母)组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/keyboard-row
2. 思路分析:
分析题目可以知道我们考虑怎么样枚举即可,首先我们需要使用哈希表记录一下每一行的字符对应的行数,遍历所有的单词,使用set集合来记录当前单词中的字符在哈希表中出现的位置,最后判断set集合的长度是否是1即可,如果是1那么将当前单词加入到答案中即可。
3. 代码如下:
from typing import List
class Solution:
def findWords(self, words: List[str]) -> List[str]:
# 键盘中每一行对应的字符
s = ["qwertyuiop", "asdfghjkl", "zxcvbnm"]
dic = dict()
# 使用字典记录下每个字符出现的行数
for i in range(len(s)):
for c in s[i]:
dic[c] = i
res = list()
for w in words:
t = set()
for c in w:
# set集合中添加当前单词出现的行数, lower将大写字母转化为小写字母
t.add(dic[c.lower()])
if len(t) == 1: res.append(w)
return res