Given a list of words, we may encode it by writing a reference string S
and a list of indexes A
.
For example, if the list of words is ["time", "me", "bell"]
, we can write it as S = "time#bell#"
and indexes = [0, 2, 5]
.
Then for each index, we will recover the word by reading from the reference string from that index until we reach a "#"
character.
What is the length of the shortest reference string S possible that encodes the given words?
Example:
Input: words = ["time", "me", "bell"] Output: 10 Explanation: S = "time#bell#" and indexes = [0, 2, 5].
Note:
1 <= words.length <= 2000
.1 <= words[i].length <= 7
.- Each word has only lowercase letters.
题目链接:https://leetcode.com/problems/short-encoding-of-words/
题目分析:Trie直接排序爆搞,排序是为了消除相同后缀的影响
44ms,击败38%
class Solution {
class TrieNode {
TrieNode[] nxt;
public TrieNode() {
this.nxt = new TrieNode[26];
}
}
int insert(TrieNode root, String s) {
TrieNode p = root;
boolean hasNewNode = false;
for (int i = s.length() - 1; i >= 0; i--) {
int idx = s.charAt(i) - 'a';
if (p.nxt[idx] == null) {
p.nxt[idx] = new TrieNode();
hasNewNode = true;
}
p = p.nxt[idx];
}
return hasNewNode ? s.length() + 1 : 0;
}
public int minimumLengthEncoding(String[] words) {
TrieNode root = new TrieNode();
Arrays.sort(words, (a, b)->Integer.compare(a.length(), b.length()));
int ans = 0;
for (int i = words.length - 1; i >= 0; i--) {
ans += insert(root, words[i]);
}
return ans;
}
}
不排序的话,就要先建好trie,算答案时只累计到叶子节点的字符串长度,注意去重
11ms,击败97%
class Solution {
class TrieNode {
TrieNode[] nxt;
boolean hasNext;
boolean vis;
public TrieNode() {
this.nxt = new TrieNode[26];
this.hasNext = false;
this.vis = false;
}
}
void insert(TrieNode root, String s) {
TrieNode p = root;
for (int i = s.length() - 1; i >= 0; i--) {
int idx = s.charAt(i) - 'a';
if (p.nxt[idx] == null) {
p.nxt[idx] = new TrieNode();
}
p.hasNext = true;
p = p.nxt[idx];
}
}
int search(TrieNode root, String s) {
TrieNode p = root;
for (int i = s.length() - 1; i >= 0; i--) {
int idx = s.charAt(i) - 'a';
if (p.nxt[idx] != null) {
p = p.nxt[idx];
}
}
if (p.vis) {
return 0;
}
p.vis = true;
return p.hasNext ? 0 : s.length() + 1;
}
public int minimumLengthEncoding(String[] words) {
TrieNode root = new TrieNode();
int ans = 0;
for (int i = words.length - 1; i >= 0; i--) {
insert(root, words[i]);
}
for (int i = words.length - 1; i >= 0; i--) {
ans += search(root, words[i]);
}
return ans;
}
}