LeetCode: Unique Word Abbreviation

LeetCode: Unique Word Abbreviation

An abbreviation of a word follows the form . Below are some examples of word abbreviations:

1
2
3
4
5
6
7
8
9
10
11
12
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
Given dictionary = [ "deer", "door", "cake", "card" ]

isUnique("dear") ->
false

isUnique("cart") ->
true

isUnique("cane") ->
false

isUnique("make") ->
true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class ValidWordAbbr {

private Map<String, Integer> map = new HashMap<>();
private Set<String> input;

public ValidWordAbbr(String[] dictionary) {

input = Arrays.stream(dictionary)
.filter(d -> (d != null && !d.isEmpty()))
.collect(Collectors.toSet());

for (String s : input) {
if (s == null) {
continue;
}
int val = 1;
String abbr = toAbbr(s);
if (map.containsKey(abbr)) {
val += map.get(abbr);
}
map.put(abbr, val);
}

}

public boolean isUnique(String word) {
if (word == null) {
return false;
}
String abbr = toAbbr(word);
return !map.containsKey(abbr) || (map.get(abbr) == 1 && input.contains(word));
}

private String toAbbr(String s) {
if (s == null || s.length() < 3) {
return s;
} else {
return "" + s.charAt(0) + (s.length() - 2) + s.charAt(s.length() - 1);
}

}
}


// Your ValidWordAbbr object will be instantiated and called as such:
// ValidWordAbbr vwa = new ValidWordAbbr(dictionary);
// vwa.isUnique("Word");
// vwa.isUnique("anotherWord");