剑指 Offer II 065. 最短的单词编码

Posted 易小顺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer II 065. 最短的单词编码相关的知识,希望对你有一定的参考价值。

算法记录

LeetCode 题目:

  单词数组 words 的 有效编码 由任意助记字符串 s 和下标数组 indices 组成,且满足:
    words.length == indices.length
    助记字符串 s 以 ‘#’ 字符结尾
    对于每个下标 indices[i] ,s 的一个从 indices[i] 开始、到下一个 ‘#’ 字符结束(但不包括 ‘#’)的 子字符串 恰好与 words[i] 相等


思路


说明

一、题目

  给定一个单词数组 words ,返回成功对 words 进行编码的最小助记字符串 s 的长度 。

二、分析

  • 从他的题目中很难看出来他需要什么结果,但是从他的范例中可,拥有相同后缀的单词可以直接进行合并小的单词。
  • 后缀好像没有什么方法来确立,但是把单词反过来看不就是单词的前缀了么,把每个单词都过一遍,单词作为其他单词前缀的直接给 pass 掉,这样输出剩余单词长度就可以了。
  • 求字符串的前缀当然少不了字典树的插足了。
class Solution 
    public int minimumLengthEncoding(String[] words) 
        Node head = new Node();
        for(String s : words) head.insert(s);
        return head.getNumber();
    

class Node
    public Node[] next;
    public Node() 
        next = new Node[26];
    
    public void insert(String s) 
        Node temp = this;
        char[] words = s.toCharArray();
        for(int i = words.length - 1; i >= 0; i--) 
            if(temp.next[words[i] - 'a'] == null) temp.next[words[i] - 'a'] = new Node();
            temp = temp.next[words[i] - 'a'];
        
    
    public int getNumber() 
        Node temp = this;
        int len = 0;
        for(int i = 0; i < 26; i++) if(temp.next[i] != null) len += number(temp.next[i], 2);
        return len;
    
    public int number(Node root, int len) 
        int ret = 0, flag = 0;
        for(int i = 0; i < 26; i++) if(root.next[i] != null) 
            ret += number(root.next[i], len + 1);
            flag = 1;
        
        return flag == 1 ? ret : len;
    


总结

熟悉字典树的结构特性和使用场景。

以上是关于剑指 Offer II 065. 最短的单词编码的主要内容,如果未能解决你的问题,请参考以下文章

每日一题剑指 Offer II 115. 重建序列

LeetCode 剑指 Offer II 115.重建序列:图解 - 拓扑排序

leetcode剑指 Offer II 008. 和大于等于 target 的最短子数组

leetcode剑指 Offer II 008. 和大于等于 target 的最短子数组

leetcode剑指 Offer II 008. 和大于等于 target 的最短子数组

剑指 Offer 精选剑指 Offer II 005. 单词长度的最大乘积