开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
一、题目描述:
给你一个字符串数组 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] 由英文字母(小写和大写字母)组成
二、思路分析:
对同一行的字母做映射,比如说第一行的所有字母映射到数字 1 并以此类推;然后对数组进行遍历,符合要求则返回(这里要注意大小写的问题) 用 正则 也可以解决这道题,只要判断该单词是否符合某一行的组合就行了
三、AC 代码:
/**
* @param {string[]} words
* @return {string[]}
*/
var findWords = function(words) {
const map = new Map([
['q',1],['w',1],['e',1],['r',1],['t',1],['y',1],['u',1],['i',1],['o',1],['p',1],
['a',2],['s',2],['d',2],['f',2],['g',2],['h',2],['j',2],['k',2],['l',2],
['z',3],['x',3],['c',3],['v',3],['b',3],['n',3],['m',3]
]), ans = []
for (const word of words) {
const target = map.get(word[0].toLowerCase())
const canBeAdded = word.split('').every((item) => {
return map.get(item.toLowerCase()) === target
})
if (canBeAdded) {
ans.push(word)
}
}
return ans
};