Leetcode--820:单词的压缩编码(java)
給定一個單詞列表,我們將這個列表編碼成一個索引字符串?S?與一個索引列表 A。
例如,如果這個列表是 ["time", "me", "bell"],我們就可以將其表示為 S = "time#bell#" 和 indexes = [0, 2, 5]。
對于每一個索引,我們可以通過從字符串 S?中索引的位置開始讀取字符串,直到 "#" 結(jié)束,來恢復(fù)我們之前的單詞列表。
那么成功對給定單詞列表進(jìn)行編碼的最小字符串長度是多少呢?
思路:
這道題就是求字符串后綴,如果字符串a(chǎn)的后綴包含字符串b,那么b就不用再添加
字典樹
先將字符串?dāng)?shù)組按照長度排序,將字符串長的先添加進(jìn)去,之后遍歷長度短的。
按照逆序?qū)⒆址迦胱值錁?#xff0c;后面的字符串如果可以在字典樹之中找到,那么就不用添加這個字符串,反之,將這個字符串也逆序插入字典樹
示例:
輸入: words = ["time", "me", "bell"]
輸出: 10
說明: S = "time#bell#" , indexes = [0, 2, 5] 。
?
提示:
1 <= words.length?<= 2000
1 <=?words[i].length?<= 7
每個單詞都是小寫字母 。
代碼:
class?Solution?{
???public?Tree?root?=?new?Tree();
????class?Tree{
????????Tree?children[]?=?new?Tree[26];
????????char?val;
????}
?????public?int?minimumLengthEncoding(String[]?words)?{
????????????if(words.length==0){
????????????????return?0;
????????????}
????????????Arrays.sort(words,?(s1,?s2)?->?s2.length()?-?s1.length());
????????????int?count?=?0;
????????????for(int?i=0;i<words.length;i++)
????????????{
????????????????count+=insert(words[i]);
????????????}
????????????return?count;
????????}
?????public?int?insert(String?word)
?????{
?????????Tree?cur?=?root;
?????????boolean?isNew?=?false;
?????????for(int?i=word.length()-1;i>=0;i--)
?????????{
?????????????int?c?=?word.charAt(i)-'a';
?????????????if(cur.children[c]==null)
?????????????{
?????????????????isNew?=?true;
?????????????????cur.children[c]?=?new?Tree();
?????????????}
?????????????cur?=cur.children[c];
?????????}
?????????return?isNew?word.length()+1:0;
?????}
}
總結(jié)
以上是生活随笔為你收集整理的Leetcode--820:单词的压缩编码(java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常染色体的隐性疾病数学建模(代数模型)
- 下一篇: 仰望星空后,更将脚踏实地!