LeetCode 288. Unique Word Abbreviation

本文介绍了一种算法,用于判断给定单词的缩写形式是否在一个特定的字典中具有唯一性。通过将字典中的单词转换为缩写形式并存储在哈希表中,可以高效地检查给定单词的缩写是否与其他单词相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

An abbreviation of a word follows the form <firstletter><number><lastletter>. Below are some examples of word abbreviations:
a) it –> it (no abbreviation)

 1

b) d|o|g –> d1g

          1    1  1
 1---5----0----5--8

c) i|nternationalizatio|n –> i18n

          1
 1---5----0

d) l|ocalizatio|n –> l10n
Assume you have a dictionary and given a word, find whether its abbreviation is unique in the dictionary. A word’s abbreviation is unique if no other word from the dictionary has the same abbreviation.

Example:
Given dictionary = [ “deer”, “door”, “cake”, “card” ]

isUnique(“dear”) -> false
isUnique(“cart”) -> true
isUnique(“cane”) -> false
isUnique(“make”) -> true

思路:
1. 把字典中每个单词转换成abbreviation存在hash中,然后把给定的单词转换成缩写后在hash中查找!
2. 如何理解A word’s abbreviation is unique if no other word from the dictionary has the same abbreviation. 是说,要么hash中没有这个缩写,要么hash中有这个缩写,但对应的单词和给的单词一样,且只有一个!!!


class ValidWordAbbr {  
public: 
    ValidWordAbbr(vector<string>&dictionary){
        string abbr;
        for(auto& cur:dictionary){
            int n=cur.size();
            if(n<=2) 
                abbr=cur;
            else 
                abbr=cur[0]+to_string(n-2)+cur[n-1];
            mm[abbr].push_back(cur);    
        }
    }
    bool isUnique(string word){
        string abbr;
        int n=word.size();
        if(n<=2) 
            abbr=word;
        else 
            abbr=word[0]+to_string(n-2)+word[n-1];
        if(mm.count(abbr)==0||(mm[abbr].size()==1&&mm[abbr][0]==word)) return true;
        return false; 
    }

private:
    unordered_map<string,vector<string>> mm;
};


// Your ValidWordAbbr object will be instantiated and called as such:  
// ValidWordAbbr vwa(dictionary);  
// vwa.isUnique("hello");  
// vwa.isUnique("anotherWord");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值