描述:
给定多个 words,words[i] 的权重为 i 。
设计一个类 WordFilter 实现函数WordFilter.f(String prefix, String suffix)。这个函数将返回具有前缀 prefix 和后缀suffix 的词的最大权重。如果没有这样的词,返回 -1。
示例:
输入:
WordFilter(["apple"])
WordFilter.f("a", "e") // 返回 0
WordFilter.f("b", "") // 返回 -1
注意:
words的长度在[1, 15000]之间。
对于每个测试用例,最多会有words.length次对WordFilter.f的调用。
words[i]的长度在[1, 10]之间。
prefix, suffix的长度在[0, 10]之前。
words[i]和prefix, suffix只包含小写字母。
思路分析:
这种单词的搜索,一般都是使用前缀树来处理,即通过前缀树的结构来来储存所有的单词集合,在搜索单词时减少重复搜索的目的。关于前缀树及其运用请翻阅 前缀树实现以及运用
第一步:建树。将vector<string>& words转换为前缀树
第二步:首先判断前缀prefix是否存在
第三步:在以prefixRoot为起始的子树中,搜索单词的后缀为suffix的最大权值
//前缀树的程序表示
class TrieNode {
public:
bool isWord;//当前节点为结尾是否是单词
int weight = 0;//只用当isWord == true,权重才有意义
vector<TrieNode*> children;
TrieNode() : isWord(false), children(26, nullptr), weight(0) {
}
~TrieNode() {
for (TrieNode* child : children)
if (child) delete child;
}