leetcode:那些年我遇到过的编程题014:单词的压缩编码
根据我对题意的理解,每次索引都是在遇到第一个“#”后停止,也就是说,判断能不能缩小字符串长度的标准在于前边的单词中的字母能不能完全包含后边单词的字母,而且要恰好在末尾结束。
class Solution {
public int minimumLengthEncoding(String[] words) {
if(words.length ==0) return 0;
int length = 0;
int[] len = new int[words.length];
for(int i = 0;i<words.length;i++){
len[i] = words[i].length();
}
length = len[0]+1;
a: for(int i = 1 ; i<len.length;i++){
for(int j = 0 ; j<i ;j++){
if(words[j].indexOf(words[i])>=0|words[i].indexOf(words[j])>=0){
if(words[j].indexOf(words[i])==(len[j]-len[i])&&words[j].indexOf(words[i])>0){
continue a;
}
if(words[i].indexOf(words[j])==(len[i]-len[j])){
length = length - len[j] + len[i];
continue a;
}
}
}
length+=len[i]+1;
}
return length;
}
}
倒了,有点难受,连着做出来好几天突然断了。看看答案。
class Solution {
public int minimumLengthEncoding(String[] words) {
int len = 0;
Trie trie = new Trie();
Arrays.sort(words,(s1,s2)->s2.length()-s1.length());
for(String word:words){
len+=trie.Check(word);
}
return len;
}
public class Trie{
TrieNode root;
public Trie(){
root = new TrieNode();
}
public int Check(String word){
TrieNode cur = root;
boolean bool = false;
for(int j = word.length()-1;j>=0;j--){
int c = word.charAt(j)-'a';
if(cur.node[c] == null){
bool = true;
cur.node[c] = new TrieNode();
}
cur = cur.node[c];
}
return bool?word.length()+1:0;
}
}
public class TrieNode{
char wo;
TrieNode[] node = new TrieNode[26];
public TrieNode(){}
}
}
主要使用了字典树,将每一个单词的倒序存储下来。在遍历后边的单词时,如果判断这条路径是走过的,那么就说明有单词是前边单词的后缀,有一个前提是单词的遍历顺序必须是从长到短的。
排列字符串数组主要用了Arrays.sort(words,(s1,s2)->s2.length()-s1.length())