1. Question
Given manywords
,words[i]
has weighti
.
Design a classWordFilter
that supports one function,WordFilter.f(String prefix, String suffix)
. It will return the word with givenprefix
andsuffix
with maximum weight. If no word exists, return -1.
Examples:
Copy Input:
WordFilter(["apple"])
WordFilter.f("a", "e") // returns 0
WordFilter.f("b", "") // returns -1
Note:
words
has length in range[1, 15000]
.
For each test case, up towords.length
queriesWordFilter.f
may be made.
words[i]
has length in range[1, 10]
.
prefix, suffix
have lengths in range[0, 10]
.
words[i]
andprefix, suffix
queries consist of lowercase letters only.
2. Implementation
(1) HashMap
Copy class WordFilter {
Map<String, Integer> map;
public WordFilter(String[] words) {
map = new HashMap<>();
for (int i = 0; i < words.length; i++) {
String curWord = words[i];
List<String> prefix = new ArrayList<>();
List<String> suffix = new ArrayList<>();
for (int j = 0; j <= curWord.length(); j++) {
prefix.add(curWord.substring(0, j));
}
for (int k = curWord.length(); k >= 0; k--) {
suffix.add(curWord.substring(k));
}
for (String p : prefix) {
for (String s : suffix) {
String key = p + "#" + s;
if (!map.containsKey(key)) {
map.put(key, i);
}
else {
map.put(key, Math.max(map.get(key), i));
}
}
}
}
}
public int f(String prefix, String suffix) {
return map.containsKey(prefix + "#" + suffix) ? map.get(prefix + "#" + suffix) : -1;
}
}
/**
* Your WordFilter object will be instantiated and called as such:
* WordFilter obj = new WordFilter(words);
* int param_1 = obj.f(prefix,suffix);
*/
(2) Trie
思路: 利用trie的特性,将suffix + "#" + prefix作为key插入trie里,并以此作为查询的key
Copy class WordFilter {
class TrieNode {
int weight;
boolean isWord;
TrieNode[] childNode;
public TrieNode() {
weight = -1;
childNode = new TrieNode[256];
}
}
class Trie {
TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String word, int weight) {
if (word == null || word.length() == 0) {
return;
}
TrieNode curNode = root;
for (char c : word.toCharArray()) {
int index = c;
if (curNode.childNode[index] == null) {
curNode.childNode[index] = new TrieNode();
}
curNode = curNode.childNode[index];
curNode.weight = weight;
}
curNode.isWord = true;
}
public TrieNode search(String word) {
if (word == null || word.length() == 0) {
return null;
}
TrieNode curNode = root;
for (char c : word.toCharArray()) {
int index = c;
if (curNode.childNode[index] == null) {
return null;
}
curNode = curNode.childNode[index];
}
return curNode;
}
public int getWeight(String word) {
TrieNode node = search(word);
return node == null ? -1 : node.weight;
}
}
Trie trie;
public WordFilter(String[] words) {
trie = new Trie();
for (int i = 0; i < words.length; i++) {
String curWord = words[i];
String key = "#" + curWord;
trie.insert(key, i);
for (int j = curWord.length() - 1; j >= 0; j--) {
key = curWord.charAt(j) + key;
trie.insert(key, i);
}
}
}
public int f(String prefix, String suffix) {
return trie.getWeight(suffix + "#" + prefix);
}
}
/**
* Your WordFilter object will be instantiated and called as such:
* WordFilter obj = new WordFilter(words);
* int param_1 = obj.f(prefix,suffix);
*/
3. Time & Space Complexity
HashMap: 时间复杂度O(nl^2), n是word的个数, l是word的平均长度, 空间复杂度O(nl^2)
Trie: 时间复杂度O(nl^2), n是word的个数, l是word的平均长度, 空间复杂度O(nl^2)