哈希算法题目:键盘行
字数 922 2025-10-30 08:32:20
哈希算法题目:键盘行
题目描述
给定一个字符串数组 words,返回其中所有单词可以用美式键盘同一行字母打印出来的单词。美式键盘的三行字母如下:
- 第一行:
qwertyuiop - 第二行:
asdfghjkl - 第三行:
zxcvbnm
示例
输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
解释:"Alaska"和"Dad"的所有字母均出现在键盘的同一行(第二行和第一行)。
解题过程
步骤1:理解核心需求
- 需要判断每个单词的所有字母是否来自键盘的同一行。
- 字母不区分大小写(例如"H"和"h"视为同一字母)。
步骤2:设计哈希映射
- 创建三个哈希集合,分别存储三行键盘的字母:
set1 = set('qwertyuiop')set2 = set('asdfghjkl')set3 = set('zxcvbnm')
- 将每个单词转换为小写后,检查其所有字母是否完全属于某个集合。
步骤3:判断逻辑
对每个单词:
- 转换为小写形式(如
"Hello"→"hello")。 - 遍历单词的每个字母,确定其所属的键盘行集合。
- 若所有字母均属于同一集合,则将该单词加入结果列表。
步骤4:优化检查过程
- 无需逐个比较三个集合,可先确定第一个字母所属的集合,再检查后续字母是否均属于该集合。
- 若遇到字母不属于初始集合,立即跳过当前单词。
步骤5:代码实现思路
- 初始化三个集合。
- 遍历
words中的每个单词:- 将单词转为小写。
- 根据首字母确定目标集合。
- 遍历单词所有字母,若存在字母不在目标集合中,跳过该单词。
- 若所有字母均通过检查,将原始单词(保留大小写)加入结果。
举例演示
以"Alaska"为例:
- 转为小写
"alaska"。 - 首字母
'a'属于第二行集合set2。 - 检查后续字母
l, a, s, k, a是否均在set2中(是)。 - 故
"Alaska"符合条件。
复杂度分析
- 时间复杂度:O(N×L),N为单词数量,L为单词平均长度。
- 空间复杂度:O(1)(仅固定大小的集合)。
通过以上步骤,即可高效筛选出满足条件的单词。