【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
  • 每个单词都是小写字母 。

思路一:存储后缀

将所有单词放在set中,对于对于set中每个单词,遍历其后缀,看是否在set中,如果在就删除,比如time,那么就遍历ime, me, e,删除me。这样就保证了set中留下来的单词不可能再合并了,最后遍历set加上每个单词长度和#号。

代码

时间复杂度:O($\sum w_{i}^2$),其中 $w_{i}$ 是words[i] 的长度,每个单词有 $w_{i}$ 个后缀,查询其是否在集合中需要进行O($w_{i}$)的哈希值计算。

空间复杂度:O($\sum w_{i}$),存储单词的空间开销。

class Solution {
public:
    int minimumLengthEncoding(vector<string>& words) {
        int res = 0;
        unordered_set<string> ust(words.begin(), words.end());
        for (string word : ust) {
            for (int i = 1; i < word.size(); ++i) {
                ust.erase(word.substr(i));
            }
        }
        for (string word : ust) {
            res += word.size() + 1;
        }
        return res;
    }
};

原文地址:https://www.cnblogs.com/galaxy-hao/p/12590041.html

时间: 2024-11-09 10:43:00

【LeetCode】820. 单词的压缩编码的相关文章

leetcode 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 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表. 那么成功对给定单词列表进行编码的最小

LeetCode 39. 单词的压缩编码

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

820. 单词的压缩编码

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

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

力扣第820题 单词的压缩编码 class TrieNode { public: map<char, TrieNode*> children; }; class Solution { public: void GetNum(TrieNode * node, int num, int& count) { if (node == NULL || node->children.size() == 0) { count += num + 1; return; } for (map<

刷题57—单词的压缩编码

94.单词的压缩编码 题目链接 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/short-encoding-of-words 题目描述 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2

[LeetCode] 139. 单词拆分 ☆☆☆(动态规划 回溯)

139. 单词拆分 描述 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词.你可以假设字典中没有重复的单词.示例 1: 输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "

leetcode 139.单词拆分

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字典中没有重复的单词. 示例 1: 输入: s = "leetcode", wordDict = ["leet", "code"] 输出: true 解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet cod

Leetcode 648.单词替换

单词替换 在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词--我们称这个词为 继承词(successor).例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个). 现在,给定一个由许多词根组成的词典和一个句子.你需要将句子中的所有继承词用词根替换掉.如果继承词有许多可以形成它的词根,则用最短的词根替换它. 你需要输出替换之后的句子. 示例 1: 输入: dict(词典) = ["cat", "ba