LeetCode刷题笔记 820. 单词的压缩编码 【反转+排序】【字典树】

反转+排序

无需字典树,轻轻一反转,结果就出来(C++/Java/Python)

class Solution {
public:
    int minimumLengthEncoding(vector<string>& words) {
        int n=words.size();
        vector<string> reversed_words;
        for(string word:words){
        	/ 反转每个单词
            reverse(word.begin(),word.end());
            reversed_words.push_back(word);
        }
        / 字典序排序
        sort(reversed_words.begin(),reversed_words.end());
        int res=0;
        for(int i=0;i<n;i++){
            if(i+1<n&&reversed_words[i+1].find(reversed_words[i])==0) ; / 当前单词是下一个单词的前缀,丢弃
            else res+=reversed_words[i].length()+1; / 单词加上一个 '#' 的长度
        }
        return res;
    }
};

字典树

99% Trie 吐血攻略,包教包会
手撕字典树(Trie 树) C++ 另附暴力哈希解法

https://leetcode-cn.com/problems/short-encoding-of-words/solution/dan-ci-de-ya-suo-bian-ma-by-leetcode-solution/

class TrieNode{
    TrieNode* children[26];
public:
    int count;
    TrieNode() {
        for (int i = 0; i < 26; ++i) children[i] = NULL;
        count = 0;
    }
    TrieNode* get(char c) {
        if (children[c - 'a'] == NULL) {
            children[c - 'a'] = new TrieNode();
            count++;
        }
        return children[c - 'a'];
    }
};
class Solution {
public:
    int minimumLengthEncoding(vector<string>& words) {
        TrieNode* trie = new TrieNode();
        unordered_map<TrieNode*, int> nodes;

        for (int i = 0; i < (int)words.size(); ++i) {
            string word = words[i];
            TrieNode* cur = trie;
            for (int j = word.length() - 1; j >= 0; --j)
                cur = cur->get(word[j]);
            nodes[cur] = i;
        }

        int ans = 0;
        for (auto& [node, idx] : nodes) {
            if (node->count == 0) {
                ans += words[idx].length() + 1;
            }
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值