LeetCode: 500. 键盘行

32 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

500. 键盘行

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ke…

给你一个字符串数组 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] 由英文字母(小写和大写字母)组成

解法

  • 使用字典和列表,遍历,如果遍历时候只出现一次时候,导入到列表中,如果出现是两行及以上,继续遍历。注意大小写问题
class Solution:
    def findWords(self, words: List[str]) -> List[str]:
        indexs = {
            '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 word in words:
            res = {}
            flag = 0
            for w in word:
                index = indexs[w.lower()]  # 统一成小写
                if len(res) == 0:
                    res[index] = ''
                else:
                    if index not in res:
                        flag = 1
                        break
            if flag == 0:
                ans.append(word)
        return ans

复杂度分析

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)