哈希算法题目:模拟哈希表实现单词缩写系统
字数 1271 2025-11-01 09:19:03
哈希算法题目:模拟哈希表实现单词缩写系统
题目描述
设计一个单词缩写系统,需实现以下功能:
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):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); } - 将单词加入
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去重特性简化唯一性判断。关键点在于正确理解缩写规则和唯一性定义,避免遗漏多次添加同一单词仍视为唯一的场景。