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