原网址为 https://leetcode.com/problems/prefix-and-suffix-search/description/
Given many words
, words[i]
has weight i
.
Design a class WordFilter
that supports one function, WordFilter.f(String prefix, String suffix)
. It will return the word with given prefix
and suffix
with maximum weight. If no word exists, return -1.
Examples:
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 to
words.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.
代码:
class TrieNode {
public:
TrieNode() {
children.resize(27, NULL);
weight = 0;
}
public:
vector<TrieNode*> children;
int weight;
};
class WordFilter {
public:
WordFilter(vector<string> words) {
root = new TrieNode();
for (int weight = 0; weight < words.size(); weight++) {
string word = words[weight] + "{";
for (int i = 0; i < word.size(); i++) {
TrieNode *cur = root;
cur->weight = weight;
for (int j = i; j < 2 * word.size() - 1; j++) {
int k = word[j % word.size()] - 'a';
if (cur->children[k] == NULL) {
cur->children[k] = new TrieNode();
}
cur = cur->children[k];
cur->weight = weight;
}
}
}
}
int f(string prefix, string suffix) {
TrieNode *cur = root;
string q = suffix + "{" + prefix;
for (int i = 0; i < q.size(); i++) {
if (cur->children[q[i] - 'a'] == NULL) {
return -1;
}
cur = cur->children[q[i] - 'a'];
}
return cur->weight;
}
public:
TrieNode *root;
};