算法记录
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;
}
}
总结
熟悉字典树的结构特性和使用场景。