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;
    }
};

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

时间: 2024-11-09 08:58:56

leetcode 820. 单词的压缩编码(字典树)的相关文章

820. 单词的压缩编码

题目: 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]. 对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表. 那么成功对给定单词列表进行编码的最

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

题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]. 对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表. 那么成功对给定单词列表进行编码的最小

【oiClass1502】查单词(Trie字典树)

题目描述 全国英语四级考试就这样如期来了,可是小y依然没有做好充分准备.为了能够大学毕业,可怜的小y决定作弊.小y费尽心机,在考试的时候夹带了一本字典进考场,但是现在的问题是,考试的时候可能有很多的单词要查,小y能不能来得及呢? 输入 第一行一个整数N,表示字典中一共有多少个单词(N<=10000).接下来每两行表示一个单词,其中:第一行是一个长度<=100的字符串,表示这个单词,全部小写字母,单词不会重复.第二行是一个整数,表示这个单词在字典中的页码.接下来是一个整数M,表示要查的单词数(M

逆序单词 HIhoCoder 1366 字典树

逆序单词 HIhoCoder 1366 字典序 题意 在英文中有很多逆序的单词,比如dog和god,evil和live等等. 现在给出一份包含N个单词的单词表,其中每个单词只出现一次,请你找出其中有多少对逆序单词. 第1行:1个整数,N,表示单词数量.2≤N≤50,000. 第2..N+1行:每行1个单词,只包含小写字母,每个单词长度不超过16个字母.保证每个单词只出现一次,且不会出现回文单词(即一个单词倒序还是它自己,比如eye). 输出第一行是个整数,表示单词表中的逆序单词的对数. 解题思路

【LeetCode】820. 单词的压缩编码

题目 给定一个单词列表,我们将这个列表编码成一个索引字符串?S?与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]. 对于每一个索引,我们可以通过从字符串 S?中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表. 那么成功对给定单词列表进行编码的最小

LeetCode 39. 单词的压缩编码

题目描述 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]. 对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表. 那么成功对给定单词列表进行编码的

Codeforces 633 C Spy Syndrome 2 字典树

题意:还是比较好理解 分析:把每个单词反转,建字典树,然后暴力匹配加密串 注:然后我就是特别不理解,上面那种能过,而且时间很短,但是我想反之亦然啊 我一开始写的是,把加密串进行反转,然后单词正着建字典树,然后就TLE了,反着写就能过 真是百思不得解,然后我猜测可能是单词数目比较少 #include <cstdio> #include <iostream> #include <cstring> #include <cstdlib> #include <v

URAL 1542. Autocompletion 字典树

给你最多10w个单词和对应的频率 接下来最多1w5千次询问 每次输入一个字符串让你从前面的单词中按照频率从大到小输出最多10个以该字符串为前缀的单词 开始把单词建成了字典树 然后每次询问找到所有满足条件的单词 在排序输出 不是超时就是超内存 还来了一发数组越界 最后换方法 因为最多只要输出前10个 那么可以把要询问的字符串建字典树 每个结尾节点在做一个映射 存10个单词(当然只是存下标) 然后再把单词按照频率从大到小排序一个一个插入字典序 满足有前缀是结尾节点就放进去 #include <cst

[ACM] hdu 1251 统计难题 (字典树)

统计难题 Problem Description Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每一个提问都是一个字符串. 注意:本题仅仅有一组測试数据,处理到文件结束. Out