問題描述:給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。例如,如果這個列表是 [「time」, 「me」, 「bell」],我們就可以將其表示為 s = 「time#bell#」 和 indexes = [0, 2, 5]。
對於每乙個索引,我們可以通過從字串 s 中索引的位置開始讀取字串,直到 「#」 結束,來恢復我們之前的單詞列表。那麼成功對給定單詞列表進行編碼的最小字串長度是多少呢?
例子:
輸入: words = [「time」, 「me」, 「bell」]
輸出: 10
說明: s = 「time#bell#」 , indexes = [0, 2, 5] 。
思路:根據例子,我們需要判斷較短字串是否是較長字串的字尾,如果是字尾,則不出現在索引字串中。
利用字典構造trie樹。力扣題實現trie(字首樹)
class
trie
:def
__init__
(self)
:# 初始化
self.data =
definsert
(self, word)
:# 插入字串word
cur = self.data
for letter in word:
cur.setdefault(letter,
) cur = cur[letter]
cur.setdefault(
'#',
)def
search
(self, word)
:# 在trie樹中搜尋word
cur = self.data
for letter in word:
if letter not
in cur:
return
false
else
: cur = cur[letter]
return
'#'in cur
defstartwith
(self, prefix)
:# 在trie樹中搜尋字首prefix
cur = self.data
for letter in prefix:
if letter not
in cur:
return
false
else
: cur = cur[letter]
return
true
# use the trie like this
obj = trie(
)obj.insert(
'hello'
)obj.search(
'hello'
)# return true
obj.search(
'hel'
)# return false
obj.startwith(
'hel'
)# return true
上面的trie樹是字首樹,問題裡實際上是字尾問題,因此,我們需要將每乙個字串反轉,然後再插入trie樹中。
def
minimumlengthencoding
(self, words: list[
str])-
>
int:
# 將字串列表重新排列,按照字串長度,從大到小排序
wordslist =
sorted
(words, key=
lambda x:
len(x)
, reverse=
true
)# 建立trie樹
obj = self.trie(
)
len_s =
0# 遍歷字串列表
for word in wordslist:
# 字串反轉
word = word[::
-1]# 如果trie樹中有word字串
if obj.search(word)
:continue
# 如果trie樹中有word字首
elif obj.startwith(word)
:continue
# 如果trie樹中不包含word字串
else
: obj.insert(word)
len_s +=
len(word)+1
return len_s
Trie 820 單詞的壓縮編碼
方法一 儲存字尾 思路 如果單詞x是y的字尾,那麼單詞x就不需要考慮了,因為編碼y的時候就同時將x編碼了。例如,如果words中同時有 me 和 time 我們就可以在不改變答案的情況下不考慮 me 如果單詞y不在任何別的單詞x的字尾 現,那麼y一定是編碼字串的一部分。因此,目標就是保留所有不是其他...
字典樹 單詞的壓縮編碼
一 基本的字典樹實現 子節點的資料結構使用了陣列的形式,也可以用鍊錶。前者佔空間更大,後者耗時更多。包含insert和find,兩個基礎的函式,用於在字典樹中插入和尋找乙個字串。預設字串都由26個小寫字母組成 如果使用鍊錶結構則不需要宣告此點 class trie void insert strin...
單詞的壓縮編碼
1 描述820 給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。例如,如果這個列表是 time me bell 我們就可以將其表示為 s time bell 和 indexes 0,2,5 對於每乙個索引,我們可以通過從字串 s 中索引的位置開始讀取字串,直到 結束,來恢...