單詞壓縮編碼 Trie樹

2021-10-04 13:27:48 字數 2350 閱讀 8650

問題描述:給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 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 中索引的位置開始讀取字串,直到 結束,來恢...