leetcode笔记之[500. 键盘行]

81 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

题目描述

原题链接 :

500. 键盘行 - 力扣(LeetCode) (leetcode-cn.com)

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

美式键盘 中:

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

image.png

示例 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] 由英文字母(小写和大写字母)组成

思路分析

因为键盘上的字母是固定的,所以想的是把键盘字母所在的行存在 map 对象里,然后循环 words, 对每个输入的字符进行循环判断,字符在 map 里不存在,表示非字母,直接跳过, 不进行判断,存在判断是字符是不是在一行上,即 map 的 value 相等,增加一个标示符, true:表示输入的字符在同一行上,flase:反之
有什么不对的地方,欢迎讨论。

AC 代码

func findWords(words []string) []string {
    if 0 == len(words) {
		return nil
	}

	keyBoardMap := map[string]int{
		"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}

	var strs []string
	for _, word := range words {
		var isRow = true
		var prevRow int
		for _, v := range word {
			if row, ok := keyBoardMap[string(v)]; !ok {
				continue
			} else {
				if 0 != prevRow && prevRow != row {
					isRow = false
					continue
				}

				prevRow = row
			}
		}

		if isRow {
			strs = append(strs, word)
		}
	}

	return strs
}

参考

【微扰理论】简单模拟 用哈希表判断字符是否出现在某一行中 - 键盘行 - 力扣(LeetCode)

【算法小爱】周末一道简单模拟😊😊😊(附技术干货目录) - 键盘行 - 力扣(LeetCode)