820. 单词的压缩编码

题目:

820. 单词的压缩编码
在这里插入图片描述

题解:

在这里插入图片描述
在这里插入图片描述

1. 题解一:存储后缀

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 题解二:字典树

  1. 解释一:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 解释二:
    在这里插入图片描述

代码:

1. 代码一:存储后缀

// 方法一: 存储后缀
public static int minimumLengthEncoding(String[] words) {
    Set<String> set = new HashSet<>(Arrays.asList(words));
    for(String word: words)
    {
        for(int k = 1; k < word.length(); k++)
        {
            set.remove(word.substring(k));
        }
    }
    int ans = 0;
    for(String word: set)
    {
        ans += word.length() + 1;
    }
    return ans;
}

2. 代码二:字典树

import java.util.*;

public class code820 {

    // 方法二: 字典树
    public static int minimumLengthEncoding(String[] words) {
        int len = 0;
        Trie trie = new Trie();
        // 先对单词列表根据单词长度由长到短排序
        Arrays.sort(words, (s1, s2) -> s2.length() - s1.length());
        // 单词插入trie,返回该单词增加的编码长度
        for(String word: words)
        {
            len += trie.insert(word);
        }
        return len;
    }

    public static void main(String[] args) {
        String words[] = {"time", "me", "bell"};
        int res = minimumLengthEncoding(words);
        System.out.println(res);
    }
}

// 定义tire
class Trie
{
    TrieNode root; // trie的根节点定义成一个空节点

    public Trie()
    {
        root = new TrieNode();
    }

    public int insert(String word)
    {
        TrieNode cur = root;
        boolean isNew = false;
        // 倒着插入单词
        for(int i = word.length() - 1; i >= 0; i--)
        {
            int c = word.charAt(i) - 'a';
            if(cur.children[c] == null)
            {
                isNew = true; // 是新单词
                cur.children[c] = new TrieNode();
            }
            cur = cur.children[c];
        }
        // 如果是新单词的话,编码长度增加新单词的长度+1,否则不变。
        return isNew ? word.length() + 1 : 0;
    }
}

// trie的节点的定义
class TrieNode
{
    char val;
    TrieNode[] children = new TrieNode[26];

    public TrieNode()
    {

    }

    public TrieNode(char val)
    {
        this.val = val;
    }
}

参考:

  1. 单词的压缩编码
  2. 99% Trie 吐血攻略,包教包会
  3. 无需字典树,轻轻一反转,结果就出来(C++/Java/Python)
  4. 手撕字典树(Trie 树) C++ 另附暴力哈希解法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dev_zyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值