题目:https://leetcode-cn.com/problems/short-encoding-of-words/
我们发现如果X单词是Y单词的后缀,那么X单词就被包含在Y单词里面,这样就不用考虑X单词了。
那么我们要做的就是看那些是后缀了,我们就用到字典树。
我们将单词反转放进树中,“time”,“me” 将其变成“emit”,“em”
这样放进树中,在树的深度较低时,它就是后缀,到树的叶子节点就是完整的单词。
class Solution {
class TrieNode{
//下一层的子节点
TrieNode[] child;
//判断是不是叶子节点
int count=0;
TrieNode(){
child=new TrieNode[26];
count=0;
}
TrieNode get(char c){
//如果没有‘c’这个字符,则创建一个
if(child[c-'a']==null){
child[c-'a']=new TrieNode();
//cout++不是叶子节点了
count++;
}
return child[c-'a'];
}
}
public int minimumLengthEncoding(String[] words) {
//根节点
TrieNode trie=new TrieNode();
Map<TrieNode,Integer> map=new HashMap();
for(int i=0;i<words.length;i++){
String str=words[i];
//每次都从根节点开始搜索
TrieNode cur=trie;
for(int j=str.length()-1;j>=0;j--){
//不断往下搜索
cur=cur.get(str.charAt(j));
}
//到了叶子节点(当前时候是叶子节点)了,记录下标
map.put(cur,i);
}
int ans=0;
//遍历所有的节点
for(TrieNode t:map.keySet())
//为叶子节点
if(t.count==0)
ans+=words[map.get(t)].length()+1;
return ans;
}
}