【力扣】500.键盘行|每日一题|刷题打卡

93 阅读1分钟

一、题目描述

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

美式键盘 中:

  • 第一行由字符 "qwertyuiop" 组成。
  • 第二行由字符 "asdfghjkl" 组成。
  • 第三行由字符 "zxcvbnm" 组成。

American keyboard

 

示例 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. 两层循环,遍历每一个字符串,判断字符出现的行数,只要line匹配不同,就直接break,否则一直累加
  3. 最后将对应的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
};