题目:
题解:
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;
}
}