# Unique Word Abbreviation

<https://leetcode.com/problems/unique-word-abbreviation/description/>

> An abbreviation of a word follows the form \<first letter>\<number>\<last letter>. 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

## Thoughts

这道题题意说的不是很清楚. 首先缩写的意思是只保留首尾两个字母, 中间替换成中间substring的长度. 给一个dict, 问对于任意新给的词word, 它的缩写是否可以由dict中不是word的词缩写而成. 直观的解法就是用一个hashmap, key是缩写, value是对应该缩写的在dict中的词. 然后对word检查缩写是否在map中, 如果在则继续检查set中是否包含word, 如果包含再继续检查除了word外是否还有其它词. 这个流程可以简化, 实际上只要对于一个key有两个不同的在dict中单词与之对应, 那这个key就不再可能是unique了. 基于此想法我们把value变成一个string即可, 如果没有额外的就维持string为那个对应的词, 如果有超过一个的就把value设为"".

## Code

```
class ValidWordAbbr {

    private String abbrev(String word) {
        StringBuilder sb = new StringBuilder();
        if (word.length() > 2) {
            sb.append(word.charAt(0)).append(word.length() - 2).append(word.charAt(word.length() - 1));
        } else {
            sb.append(word);
        }
        return sb.toString();
    }

    Map<String, String> map = new HashMap<>();
    public ValidWordAbbr(String[] dictionary) {
        for (String str : dictionary) {
            String abbr = abbrev(str);
            if (!map.containsKey(abbr)) {
                map.put(abbr, str);
            } else if (!map.get(abbr).equals(str)) {
                map.put(abbr, "");
            }
        }
    }

    public boolean isUnique(String word) {
        String abbr = abbrev(word);
        return !map.containsKey(abbr) || map.get(abbr).equals(word);
    }
}

/**
 * Your ValidWordAbbr object will be instantiated and called as such:
 * ValidWordAbbr obj = new ValidWordAbbr(dictionary);
 * boolean param_1 = obj.isUnique(word);
 */
```

## Analysis

时间复杂度O(N). 空间O(N).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hao-fu-1.gitbook.io/oj/hash/jian-guo/unique-word-abbreviation.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
