單詞的壓縮編碼
給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 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
每個單詞都是小寫字母 。
官方題解:
方法一:儲存字尾
思路如果單詞 x 是 y 的字尾,那麼單詞 x 就不需要考慮了,因為編碼 y 的時候就同時將 x 編碼了。例如,如果 words 中同時有 「me」 和 「time」,我們就可以在不改變答案的情況下不考慮 「me」。
如果單詞 y 不在任何別的單詞 x 的字尾**現,那麼 y 一定是編碼字串的一部分。
因此,目標就是保留所有不是其他單詞字尾的單詞,最後的結果就是這些單詞長度加一的總和,因為每個單詞編碼後後面還需要跟乙個 # 符號。
由資料範圍可知乙個單詞最多含有 7 個字尾,所以我們可以列舉單詞所有的字尾。對於每個字尾,如果其存在 words 列表中,我們就將其從列表中刪除。為了高效刪除,我們將 words 用雜湊集合(hashset)來儲存。
class solution
int ans = 0;
for(string word: good)
ans += word.length(
) + 1;
return ans;
}}
官方題解中巧妙使用set集合,利用set集合的不可重複的特性,將模式串的部分字尾作為目標串,尋找set集合中與目標串相同的字串,存在相同則刪除,最後set集合剩餘單詞的總長度為編碼的長度。 單詞的壓縮編碼
1 描述820 給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 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...
820 單詞的壓縮編碼
給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。例如,如果這個列表是 time me bell 我們就可以將其表示為 s time bell 和 indexes 0,2,5 對於每乙個索引,我們可以通過從字串 s 中索引的位置開始讀取字串,直到 結束,來恢復我們之前的單詞...