【中等】力扣算法题解析LeetCode288:单词的唯一缩写

关注文末推广名片,即可免费获得本题测试源码

题目来源:🔒LeetCode288:单词的唯一缩写

问题抽象: 设计一个类 ValidWordAbbr,用于高效验证给定单词在字典中的缩写是否唯一(即字典中不存在其他单词具有相同缩写),满足以下核心需求:

  1. 缩写规则定义

    • 短单词(长度 ≤2):缩写为原单词(如 "a"→"a");
    • 长单词(长度 ≥3):缩写为 首字母 + (长度-2) + 尾字母(如 "hello"→"h3o")。
  2. 类功能定义

    • 初始化:接收字符串数组 dictionary(字典),构建缩写映射;
    • 唯一性验证isUnique(word) 判断 word 的缩写在字典中是否 仅由该单词独占(无其他单词共享)。
  3. 唯一性规则

    • 独占条件:若字典中存在与 word 相同缩写的单词,则这些单词必须 全是 word 本身(允许重复);
    • 无冲突:若字典中无任何单词与 word 缩写相同,视为唯一;
    • 存在冲突:若字典中存在 不同于 word 的单词 与其缩写相同,视为不唯一。
  4. 输入约束

    • 字典长度 1 ≤ len(dictionary) ≤ 3×10^4,单词长度 1 ≤ len(word) ≤ 50
    • 时间复杂度:
      • 初始化 O(n)n 为字典单词总数);
      • isUnique 方法 O(1)(哈希表查询);
    • 空间复杂度 O(n)(存储缩写映射)。
  5. 边界处理

    • 空字典:初始化无单词,所有 isUnique 查询返回 true
    • 重复单词:如字典 ["a","a"]isUnique("a") 返回 true(独占缩写);
    • 缩写相同但单词不同:如字典 ["deer","door"]isUnique("dear") 返回 false(缩写均为 "d2r");
    • 单词不在字典:如字典 ["cake"]isUnique("cane") 返回 false(缩写 "c2e" 冲突)。

类接口定义

class ValidWordAbbr {  
    public ValidWordAbbr(String[] dictionary);  // 初始化  
    public boolean isUnique(String word);       // 验证唯一性  
}  

解题思路

  1. 核心问题

    • 判断目标单词的缩写是否仅由自身使用(若它在字典中),或未被任何字典单词使用(若它不在字典中)。
  2. 优化策略

    • 哈希表存储缩写计数:预处理字典,计算每个单词的缩写并记录出现次数。
    • 去重处理:字典可能有重复单词,需用 Set 存储原始单词,避免重复计数。
    • 边界处理:单词长度≤2时无需计算缩写,直接返回 true
  3. 关键逻辑isUnique 方法):

    • 若目标单词的缩写不存在于字典 → 唯一(true)。
    • 若目标单词在字典中,且其缩写仅由它自己使用(计数=1) → 唯一(true)。
    • 其他情况(缩写被其他单词使用) → 不唯一(false)。

代码实现(Java版)🔥点击下载源码

public class ValidWordAbbr {
    private final Map<String, Integer> abbrCountMap; // 存储缩写及其出现次数
    private final Set<String> wordSet;               // 存储字典原始单词(去重)

    public ValidWordAbbr(String[] dictionary) {
        abbrCountMap = new HashMap<>();
        wordSet = new HashSet<>(Arrays.asList(dictionary)); // 去重
        
        for (String word : wordSet) {
            String abbr = getAbbreviation(word);
            // 仅处理长度>2的单词(长度≤2的缩写即自身,无需存储)
            if (abbr != null) {
                abbrCountMap.put(abbr, abbrCountMap.getOrDefault(abbr, 0) + 1);
            }
        }
    }
    
    public boolean isUnique(String word) {
        // 长度≤2的单词缩写即自身,默认唯一
        if (word.length() <= 2) {
            return true;
        }
        
        String abbr = getAbbreviation(word);
        // 情况1:缩写不存在于字典 → 唯一
        if (!abbrCountMap.containsKey(abbr)) {
            return true;
        }
        // 情况2:单词在字典中且其缩写仅被自己使用 → 唯一
        if (wordSet.contains(word) && abbrCountMap.get(abbr) == 1) {
            return true;
        }
        // 其他情况:缩写被其他单词占用 → 不唯一
        return false;
    }
    
    // 辅助方法:生成单词缩写(长度>2时)
    private String getAbbreviation(String word) {
        if (word.length() <= 2) {
            return null; // 长度≤2的单词无需生成特殊缩写
        }
        return word.charAt(0) + 
               String.valueOf(word.length() - 2) + 
               word.charAt(word.length() - 1);
    }
}

代码说明

  1. 预处理字典

    • wordSet 去重存储字典单词,避免重复计数(如 ["a","a"] 视为一个单词)。
    • abbrCountMap 仅存储长度>2单词的缩写,减少内存占用。
  2. 缩写生成逻辑

    • 长度≤2的单词(如 "it")在 isUnique 中直接判断为唯一,不生成缩写。
    • 长度>2的单词缩写格式:首字母 + (长度-2) + 尾字母(如 "dog"→"d1g")。
  3. 唯一性判断

    • 目标单词的缩写未出现在 abbrCountMap 中 → 唯一(true)。
    • 目标单词在字典中且其缩写计数为1 → 唯一(true)。
    • 缩写被其他单词占用 → 不唯一(false)。
  4. 复杂度时间复杂度:构造方法:O(N)N 为字典去重后的单词数。isUniqueO(1)(哈希表查询)。空间复杂度O(N)(存储缩写和单词集合)。


提交详情在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值