LeetCode820 單詞的壓縮編碼

2021-10-04 13:04:45 字數 1616 閱讀 4687

題目描述:

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

2000

2.1<= words[i]

.length <=

73.每個單詞都是小寫字母 。

解題思路1:

1.不得不說力扣的判題機制太強了,用例過了29個,還差最後乙個的時候給我來了二百個字串,真的是吃屎的衝動都有了,於是我想把最後乙個用力自己手動寫上去,結果還是不行,原來前邊也有超過200的用例,真的是枯了

2.那麼來說一下我的思路吧,題目 說的是僅用字串和下標可以表示所有的單詞,但必須以井號結尾,這就排除了有的單詞可以在其中間的情況,只能是單詞的字尾,因為有次序的原因,me,time和time和me兩種情況,於是我便用列舉把每個單詞都在原陣列中檢視一遍,如果是其中的字尾便pass,但是漏洞就是如果陣列的單詞都一樣便都會被過濾掉,所以我只能看了官方的題解,如果大佬們有 什麼好的方法可以教教我。

解題思路2:

1.官方題解用了字典樹的知識

字典樹:又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。

2.如果單詞 x 是 y 的字尾,那麼單詞 x 就不需要考慮了,因為編碼 y 的時候就同時將 x 編碼了。例如,如果 words 中同時有 「me」 和 「time」,我們就可以在不改變答案的情況下不考慮 「me」。

3.如果單詞 y 不在任何別的單詞 x 的字尾**現,那麼 y 一定是編碼字串的一部分。

因此,目標就是保留所有不是其他單詞字尾的單詞,最後的結果就是這些單詞長度加一的總和,因為每個單詞編碼後後面還需要跟乙個 # 符號。

4.於是便用set過濾掉相同字串,然後在set中把每個單詞的字尾刪除,不得不說這種方法很牛掰

解題**:

public

class

solution

for(string str:arr)

}for

(string str:arr)

return sum;

}}

Leetcode 820 單詞的壓縮編碼

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

LeetCode 820 單詞的壓縮編碼

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

LeetCode 820 單詞的壓縮編碼

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