哈希算法题目:键盘行
字数 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:判断逻辑
对每个单词:

  1. 转换为小写形式(如"Hello"→"hello")。
  2. 遍历单词的每个字母,确定其所属的键盘行集合。
  3. 若所有字母均属于同一集合,则将该单词加入结果列表。

步骤4:优化检查过程

  • 无需逐个比较三个集合,可先确定第一个字母所属的集合,再检查后续字母是否均属于该集合。
  • 若遇到字母不属于初始集合,立即跳过当前单词。

步骤5:代码实现思路

  1. 初始化三个集合。
  2. 遍历words中的每个单词:
    • 将单词转为小写。
    • 根据首字母确定目标集合。
    • 遍历单词所有字母,若存在字母不在目标集合中,跳过该单词。
    • 若所有字母均通过检查,将原始单词(保留大小写)加入结果。

举例演示
"Alaska"为例:

  1. 转为小写"alaska"
  2. 首字母'a'属于第二行集合set2
  3. 检查后续字母l, a, s, k, a是否均在set2中(是)。
  4. "Alaska"符合条件。

复杂度分析

  • 时间复杂度:O(N×L),N为单词数量,L为单词平均长度。
  • 空间复杂度:O(1)(仅固定大小的集合)。

通过以上步骤,即可高效筛选出满足条件的单词。

哈希算法题目:键盘行 题目描述 给定一个字符串数组 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)(仅固定大小的集合)。 通过以上步骤,即可高效筛选出满足条件的单词。