哈希算法题目:模拟哈希表实现单词缩写系统
字数 1271 2025-11-01 09:19:03

哈希算法题目:模拟哈希表实现单词缩写系统

题目描述
设计一个单词缩写系统,需实现以下功能:

  1. add(word):添加单词到系统。
  2. isUnique(word):检查单词的缩写是否唯一。缩写规则为:若单词长度≤2,缩写为原单词;否则缩写为“首字母+中间字母数量+尾字母”(例如,“international”的缩写为“i11l”)。
  3. 若单词的缩写不存在于系统中,或虽存在但所有对应缩写相同的单词均与当前单词相同,则返回true;否则返回false

解题过程

步骤1:理解缩写规则与唯一性定义

  • 缩写规则:
    • 长度≤2的单词(如"it")缩写为原单词("it")。
    • 长度≥3的单词(如"apple")缩写为首字母 + (长度-2) + 尾字母("a3e")。
  • 唯一性判断:
    • 若缩写不存在于系统,必然唯一(例如首次添加"apple")。
    • 若缩写已存在,但所有产生该缩写的单词与当前单词相同(例如多次添加"apple"),仍视为唯一。
    • 若缩写存在且存在其他不同单词(如"apple"和"apply"缩写均为"a3y"),则当前单词不唯一。

步骤2:设计数据结构

需要记录每个缩写对应的所有单词,但为避免存储重复单词,使用哈希表映射缩写单词集合(如HashSet)。

  • 核心结构:HashMap<String, Set<String>> dict,键为缩写,值为对应单词集合。

步骤3:实现添加单词功能

  1. 计算单词的缩写(辅助函数getAbbr):
    private String getAbbr(String word) {
        if (word.length() <= 2) return word;
        return word.charAt(0) + String.valueOf(word.length() - 2) + word.charAt(word.length() - 1);
    }
    
  2. 将单词加入dict
    • 若缩写不存在,创建新集合并添加单词。
    • 若缩写已存在,直接添加单词到现有集合(Set自动去重)。

步骤4:实现唯一性检查

  1. 获取单词的缩写abbr
  2. abbr不在dict中,返回true(无冲突)。
  3. abbr存在,检查其对应的单词集合:
    • 若集合仅包含当前单词(即使多次添加),返回true
    • 若集合包含其他单词,返回false

示例

  • 添加["apple", "apply"]后,检查"apple"
    • 缩写均为"a3y",集合为{"apple", "apply"},存在其他单词 → isUnique("apple")返回false
  • 仅添加["apple"]时,集合为{"apple"}isUnique("apple")返回true

步骤5:边界情况处理

  • 空单词:题目未明确,假设输入单词长度≥1。
  • 重复添加:通过Set自动去重,不影响唯一性逻辑。
  • 大小写敏感:题目通常默认敏感(如"Apple"和"apple"视为不同单词)。

步骤6:复杂度分析

  • 添加和查询操作均需计算缩写(O(1))和哈希表操作(平均O(1)),整体高效。
  • 空间复杂度:O(N),N为所有添加的不同单词数量。

总结
本题通过哈希表维护缩写到单词集合的映射,利用Set去重特性简化唯一性判断。关键点在于正确理解缩写规则和唯一性定义,避免遗漏多次添加同一单词仍视为唯一的场景。

哈希算法题目:模拟哈希表实现单词缩写系统 题目描述 设计一个单词缩写系统,需实现以下功能: add(word) :添加单词到系统。 isUnique(word) :检查单词的缩写是否唯一。缩写规则为:若单词长度≤2,缩写为原单词;否则缩写为“首字母+中间字母数量+尾字母”(例如,“international”的缩写为“i11l”)。 若单词的缩写不存在于系统中,或虽存在但所有对应缩写相同的单词均与当前单词相同,则返回 true ;否则返回 false 。 解题过程 步骤1:理解缩写规则与唯一性定义 缩写规则: 长度≤2的单词(如"it")缩写为原单词("it")。 长度≥3的单词(如"apple")缩写为 首字母 + (长度-2) + 尾字母 ("a3e")。 唯一性判断: 若缩写不存在于系统,必然唯一(例如首次添加"apple")。 若缩写已存在,但所有产生该缩写的单词与当前单词相同(例如多次添加"apple"),仍视为唯一。 若缩写存在且存在其他不同单词(如"apple"和"apply"缩写均为"a3y"),则当前单词不唯一。 步骤2:设计数据结构 需要记录每个缩写对应的所有单词,但为避免存储重复单词,使用哈希表映射 缩写 到 单词集合 (如 HashSet )。 核心结构: HashMap<String, Set<String>> dict ,键为缩写,值为对应单词集合。 步骤3:实现添加单词功能 计算单词的缩写(辅助函数 getAbbr ): 将单词加入 dict : 若缩写不存在,创建新集合并添加单词。 若缩写已存在,直接添加单词到现有集合( Set 自动去重)。 步骤4:实现唯一性检查 获取单词的缩写 abbr 。 若 abbr 不在 dict 中,返回 true (无冲突)。 若 abbr 存在,检查其对应的单词集合: 若集合仅包含当前单词(即使多次添加),返回 true 。 若集合包含其他单词,返回 false 。 示例 : 添加 ["apple", "apply"] 后,检查 "apple" : 缩写均为 "a3y" ,集合为 {"apple", "apply"} ,存在其他单词 → isUnique("apple") 返回 false 。 仅添加 ["apple"] 时,集合为 {"apple"} → isUnique("apple") 返回 true 。 步骤5:边界情况处理 空单词:题目未明确,假设输入单词长度≥1。 重复添加:通过 Set 自动去重,不影响唯一性逻辑。 大小写敏感:题目通常默认敏感(如"Apple"和"apple"视为不同单词)。 步骤6:复杂度分析 添加和查询操作均需计算缩写(O(1))和哈希表操作(平均O(1)),整体高效。 空间复杂度:O(N),N为所有添加的不同单词数量。 总结 本题通过哈希表维护缩写到单词集合的映射,利用 Set 去重特性简化唯一性判断。关键点在于正确理解缩写规则和唯一性定义,避免遗漏多次添加同一单词仍视为唯一的场景。