3種方法 實現單詞的壓縮編碼

2021-10-04 12:25:14 字數 3497 閱讀 6565

no. 820

給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 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] 。

1 <= words.length <= 2000

1 <= words[i].length <= 7

每個單詞都是小寫字母 。

思路:對列表中所有字串進行兩兩對比,如果字串a屬於字串b的尾巴,則刪除字串a,統計最後剩餘的字串的總長度,即為題目所求。

對列表中字串按字串長度,由大到小排序

依次對所有字串進行兩兩比較,對於每個母串,需要增加乙個#分隔符

統計所有母串長度,並累計分隔符個數

# author: [email protected]

class

solution

:def

minimumlengthencoding

(self, words: list[

str])-

>

int:

words =

list

(set

(words)

)#去重

words.sort(key =

lambda x:

len(x)

, reverse=

true

)#按長度右大到小排序

rstcnt, wordscnt =0,

len(words)

wordslen =

[len

(x)for x in words]

#獲取長度,減少迴圈中多次獲取

for i in

range(0

,wordscnt):if

len(words[i])==

0:#字串已經被刪除

continue

rstcnt += wordslen[i]+1

# 1是井號分隔符

for j in

range

(i+1

,wordscnt):if

len(words[j])==

0:continue

if words[i]

[wordslen[i]

- wordslen[j]:]

== words[j]

:#j是i的尾巴

words[j]=''

return rstcnt

思路:對列表中的每個字串,刪除其字尾中包含的所有其它字串,統計最後剩餘的字串長度

將列表轉換為集合,可以去重

利用集合的discard函式,刪除所有匹配到字尾的字串集合

統計最後剩餘字串的長度,並增加井號分隔符個數

# author: [email protected]

class

solution

:def

minimumlengthencoding

(self, words: list[

str])-

>

int:

wordset =

set(words)

#清除重複字串,並返回set集合

for word in words:

for i in

range(1

,len

(word)):

wordset.discard(word[i:])

#刪除當前字串所有字尾相同的子串集合

rstcnt =

sum(

[len

(x)+

1for x in wordset]

)return rstcnt

思路:將所有字串組成乙個字典樹,統計所有樹枝對應字串長度,由於是對字串字尾匹配,所以將字串反轉後構建字典樹。

首先對原始資料去重,並對字串反轉

構建字典樹,並儲存當前節點深度

遍歷字典樹,累計葉子節點深度值

# author: [email protected]

class

trienode

:def

__init__

(self)

: self.children =

self.dept =

0# 葉子節點深度

#構建字典樹

defaddword

(self,word:

str, idx:

int)

:if idx >=

len(word)

:return

tmpnode = self.children[word[idx]

]if self.children.__contains__(word[idx]

)else trienode(

) tmpnode.dept = idx +

1 tmpnode.addword(word,idx+1)

#遞迴構建

self.children[word[idx]

]= tmpnode

#統計樹中節點個數

defcount

(self)

: rst =

0for k in self.children:

rst += self.children[k]

.count(

)#遞迴累加

ifnot self.children :

# 統計所有葉子節點的深度,1是井號分隔符

return self.dept +

1return rst

class

solution

:def

minimumlengthencoding

(self, words: list[

str])-

>

int:

words =

[word[::

-1]for word in

set(words)

]#去重,反轉

trie = trienode(

)for word in words:

trie.addword(word,0)

return trie.count(

)

單詞的壓縮編碼

1 描述820 給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。例如,如果這個列表是 time me bell 我們就可以將其表示為 s time bell 和 indexes 0,2,5 對於每乙個索引,我們可以通過從字串 s 中索引的位置開始讀取字串,直到 結束,來恢...

LeedCode 單詞的壓縮編碼

單詞的壓縮編碼 給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。例如,如果這個列表是 time me bell 我們就可以將其表示為 s time bell 和 indexes 0,2,5 對於每乙個索引,我們可以通過從字串 s 中索引的位置開始讀取字串,直到 結束,來恢...

leetcode單詞的壓縮編碼

1.反轉 排序 當乙個字串是另乙個字串的字尾時,該字串可以省略,如me是time的字尾 首先遍歷字串陣列,反轉每乙個字串,然後將字串陣列按照字典需排列 如time me bell 反轉emit em lleb 按字典序排列 em emit lleb 只需要比較相鄰的字串是否後乙個包含前乙個即可 如e...