链接: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.
Consider the word 'apple'
. For each suffix of the word, we could insert that suffix, followed by '{'
, followed by the word, all into the trie.
For example, we will insert '{apple', 'e{apple', 'le{apple', 'ple{apple', 'pple{apple', 'apple{apple'
into the trie. Then for a query like prefix = "ap", suffix = "le"
, we can find it by querying our trie for le{ap
.
'{' 的ascii码在紧接在'z'后面。
class TrieNode{
public:
TrieNode* next[27];
int weight;
TrieNode()
{
memset(next,0,sizeof(next));
weight=0;
}
};
class WordFilter {
public:
TrieNode* root;
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->next[k])
cur->next[k]=new TrieNode();
cur=cur->next[k];
cur->weight=weight;
}
}
}
}
int f(string prefix, string suffix) {
TrieNode* p=root;
for(auto c:(suffix+'{'+prefix))
{
if(!p->next[c-'a']) return -1;
p=p->next[c-'a'];
}
return p->weight;
}
};