leetcode 820. 单词的压缩编码(字典树)

Posted wz-archer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 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
每个单词都是小写字母 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/short-encoding-of-words

bool cmp(string a,string b)
{
    return a.length()<b.length();
}
const int maxnode=14000+10;
const int sigma_size=26;
struct trie{
    int ch[maxnode][sigma_size];
    int val[maxnode];
    int sz;

    trie(){
        sz=1;
        memset(val,0,sizeof(val));
        memset(ch[0],0,sizeof(ch[0]));
    }

    int idx(char c){return c-a;}
    int iinsert(string s){
        int u=0,n=s.length();
        int num=n+1;
        for(int i=n-1;i>=0;i--){
            int c=idx(s[i]);
            if(!ch[u][c]){
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz]=0;
                ch[u][c]=sz++;
            }
            u=ch[u][c];

            if(val[u]==2){
                num=(num-(n-i)-1);
                val[u]=1;
            }
        }
        val[u]=2;
        return num;
    }
};
class Solution {
public:
    int minimumLengthEncoding(vector<string>& words) {
        int num=0;
        trie a;
        sort(words.begin(),words.end(),cmp);
        for(int i=0;i<words.size();i++){
            num+=a.iinsert(words[i]);
        }
        return num;
    }
};

 

以上是关于leetcode 820. 单词的压缩编码(字典树)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 820. 单词的压缩编码

python set() leetcode 签到820. 单词的压缩编码

力扣第820题 单词的压缩编码

820. 单词的压缩编码

关于LeetCode解题提升

LeetCode 39. 单词的压缩编码