码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-03-28 23:26:27      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:max   val   恢复   提示   压缩   minimum   字符   min   dex   

给定一个单词列表,我们将这个列表编码成一个索引字符串 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. 单词的压缩编码(字典树)

标签:max   val   恢复   提示   压缩   minimum   字符   min   dex   

原文地址:https://www.cnblogs.com/wz-archer/p/12589862.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!