一、题目描述
给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
美式键盘 中:
- 第一行由字符
"qwertyuiop"组成。 - 第二行由字符
"asdfghjkl"组成。 - 第三行由字符
"zxcvbnm"组成。
示例 1:
输入: words = ["Hello","Alaska","Dad","Peace"]
输出: ["Alaska","Dad"]
示例 2:
输入: words = ["omk"]
输出: []
示例 3:
输入: words = ["adsdf","sfd"]
输出: ["adsdf","sfd"]
提示:
1 <= words.length <= 201 <= words[i].length <= 100words[i]由英文字母(小写和大写字母)组成
二、思路分析
- 先将字母都映射在一个对象中
- 两层循环,遍历每一个字符串,判断字符出现的行数,只要
line匹配不同,就直接break,否则一直累加 - 最后将对应的
str添加进去返回即可
三、代码分析
/**
* @param {string[]} words
* @return {string[]}
*/
var findWords = function (words) {
const line1 = 'qwertyuiop'
const line2 = 'asdfghjkl'
const line3 = 'zxcvbnm'
const arr = []
const rowMap = {
'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
};
for (var i = 0; i < words.length; i++) {
let temp = words[i]
let str = words[i].toLocaleLowerCase()
let line = 0
let sum = 0
for (var j = 0; j < str.length; j++) {
let s = str[j].toLocaleLowerCase()
if (line !== 0) {
if (rowMap[s] !== line) {
break
}
}
line = rowMap[s]
sum++
if (sum === str.length) {
arr.push(temp)
}
}
}
return arr
};