开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
一、题目描述:
500. 键盘行 - 力扣(LeetCode) (leetcode-cn.com)
给你一个字符串数组 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] 由英文字母(小写和大写字母)组成
二、思路分析:
- 创建哈希表,结构为:第n行的字符:n,以此来查询所求单词的各个字符在第几行
- 遍历列表words,再遍历每个单词的各个字符,看是否是同一行,我这里设置了一个flag,如果遇到不是同一行的,就设Flag为False
- 最后根据Flag的值来判断单词是否符合要求
三、AC 代码:
class Solution:
def findWords(self, words: List[str]) -> List[str]:
dct={}
for i in 'qwertyuiopQWERTYUIOP': #第一行
dct[i]=1
for i in 'asdfghjklASDFGHJKL': #第二行
dct[i]=2
for i in 'zxcvbnmZXCVBNM': #第三行
dct[i]=3
ans=[] #目标数组
for word in words: #遍历单词表
flag=True #初值设为True,如果最后也是True,说明这个单词的所有字符都是一行
for chr in word: #遍历字符
if dct[chr]!=dct[word[0]]: #以第一个字符的行数为准,遇到不同行直接判否
flag=False
break
if flag: #遍历结束仍然True,则添加进结果
ans.append(word)
return ans #返回目标数组