class Trie {
private:
// 前缀树, 相当于26叉树
vector<Trie*> next;
// 判断是否为单词终点
bool isWrod;
// 因为search,startsWith方法都需要查询,所以提取出查询方法
// 直接返回查询最后的点
Trie* searchPrefix(string prefix) {
Trie* node = this;
for(char ch : prefix) {
int index = ch - ‘a’;
if(node->next[index] != nullptr) {
node = node->next[index];
}else {
return nullptr;
}
}
return node;
}
public:
Trie():next(26),isWrod(false) {}
void insert(string word) {
int count = 0;
// 指向当前类,每个类都有26个分支
Trie* node = this;
for(char ch : word) {
int index = ch - ‘a’;
if(node->next[index] == nullptr) {
// 创建父类节点的index节点,此时index也有26个分支
node->next[index] = new Trie();
}
// 将父类指向index节点
node = node->next[index];
}
// 创建完当前node指向最后一个单词,设为单词终点
node->isWrod = true;
}
// 不为空 and 最后一个点的isWrod为true 代表word存在
bool search(string word) {
Trie* node = this->searchPrefix(word);
return node != nullptr && node->isWrod;
}
// 不为空即查到了前缀
bool startsWith(string prefix) {
Trie* node = this->searchPrefix(prefix);
return node != nullptr;
}
};
=========================================================================
题目:
在英语中,有一个叫做 词根(
root
) 的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor
)。例如,词根an
,跟随着单词other
(其他),可以形成新的单词another
(另一个)。
现在,给定一个由许多词根组成的词典和一个句子,需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。
需要输出替换之后的句子。
示例:
输入:dictionary = [“cat”,“bat”,“rat”], sentence = “the cattle was rattled by the battery”
输出:“the cat was rat by the bat”
提示: