剑指 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. 最短的单词编码的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 剑指 Offer II 115.重建序列:图解 - 拓扑排序
leetcode剑指 Offer II 008. 和大于等于 target 的最短子数组
leetcode剑指 Offer II 008. 和大于等于 target 的最短子数组