-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path820 Short Encoding of Words.py
57 lines (43 loc) · 1.35 KB
/
820 Short Encoding of Words.py
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
49
50
51
52
53
54
55
56
57
#!/usr/bin/python3
"""
Given a list of words, we may encode it by writing a reference string S and a
list of indexes A.
For example, if the list of words is ["time", "me", "bell"], we can write it as
S = "time#bell#" and indexes = [0, 2, 5].
Then for each index, we will recover the word by reading from the reference
string from that index until we reach a "#" character.
What is the length of the shortest reference string S possible that encodes the
given words?
Example:
Input: words = ["time", "me", "bell"]
Output: 10
Explanation: S = "time#bell#" and indexes = [0, 2, 5].
Note:
1 <= words.length <= 2000.
1 <= words[i].length <= 7.
Each word has only lowercase letters.
"""
from typing import List
class Solution:
def minimumLengthEncoding(self, words: List[str]) -> int:
"""
suffix trie
only suffix matters
fast trie with dict
"""
root = {}
ends = []
for word in set(words):
cur = root
for c in word[::-1]:
nxt = cur.get(c, {})
cur[c] = nxt
cur = nxt
ends.append((cur, len(word)))
return sum(
l + 1
for node, l in ends
if len(node) == 0 # no child
)
if __name__ == "__main__":
assert Solution().minimumLengthEncoding(["time", "me", "bell"]) == 10