745. Prefix and Suffix Search
Description
Design a special dictionary that searches the words in it by a prefix and a suffix.
Implement the WordFilter
class:
WordFilter(string[] words)
Initializes the object with thewords
in the dictionary.f(string pref, string suff)
Returns the index of the word in the dictionary, which has the prefixpref
and the suffixsuff
. If there is more than one valid index, return the largest of them. If there is no such word in the dictionary, return-1
.
Example 1:
Input ["WordFilter", "f"] [[["apple"]], ["a", "e"]] Output [null, 0] Explanation WordFilter wordFilter = new WordFilter(["apple"]); wordFilter.f("a", "e"); // return 0, because the word at index 0 has prefix = "a" and suffix = "e".
Constraints:
1 <= words.length <= 104
1 <= words[i].length <= 7
1 <= pref.length, suff.length <= 7
words[i]
,pref
andsuff
consist of lowercase English letters only.- At most
104
calls will be made to the functionf
.
Solutions
Solution: Trie
- Time complexity: O(words.length*word[index].length2)
- Space complexity: O(words.length*word[index].length2)
JavaScript
js
/**
* @param {string[]} words
*/
const WordFilter = function (words) {
this.trie = new Map();
for (const [index, word] of words.entries()) {
let prefix = '';
for (let left = 0; left < word.length; left++) {
let current = this.trie;
prefix += word[left];
if (!current.has(prefix)) {
current.set(prefix, new Map());
}
current = current.get(prefix);
for (let right = 0; right < word.length; right++) {
const suffix = word.slice(right);
current.set(suffix, index);
}
}
}
};
/**
* @param {string} pref
* @param {string} suff
* @return {number}
*/
WordFilter.prototype.f = function (pref, suff) {
if (!this.trie.has(pref)) return -1;
const current = this.trie.get(pref);
return current.get(suff) ?? -1;
};
/**
* Your WordFilter object will be instantiated and called as such:
* var obj = new WordFilter(words)
* var param_1 = obj.f(pref,suff)
*/