字典树 LeetCode算法题820. 单词的压缩编码

字典树解法

//字典树的结点
class TireNode{
    public char val;
    //一个字母结点的后代可能有26个(a - z)
    public TireNode[] children = new TireNode[26];

    public TireNode() {
        val = ' ';
    }

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

//字典树
class Tire{
    //头结点,自身不存储任何信息,子结点才存储信息
    private TireNode root;

    public Tire() {
        root = new TireNode();
    }

    public Tire(TireNode root) {
        this.root = root;
    }

    //插入新单词
    public int insert(String word){
        TireNode cur = root;
        boolean isNew = false;

        //单词从尾部开始遍历,且当前的单词长度小于所有已经插入的单词的长度
        for(int i = word.length() - 1; i >= 0; i--){
            char c = word.charAt(i);

            /*
            由于当前单词的长度小于所有已经插入的单词的长度,
            当出现新的字母的时候,该单词就无法利用已有的字典树,
            例如:user和loser(倒序为"resu" 和 "resol")
            的编码长度应为11("user#loser#")。
             */
            if(cur.children[c - 'a'] == null){
                cur.children[c - 'a'] = new TireNode(c);
                cur = cur.children[c - 'a'];
                isNew = true;
            }
            else {
                cur = cur.children[c - 'a'];
            }
        }

        return isNew? word.length() + 1 : 0;
    }
}

class Solution {
    public int minimumLengthEncoding(String[] words) {
        Tire tire = new Tire();
        int len = 0;

        //将单词按长度降序排列
        Arrays.sort(words, (s, t) -> {return -(s.length() - t.length());});

        //往字典树插入单词
        for(String s : words){
            len += tire.insert(s);
        }

        return len;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值