题目来源于知识星球—英雄算法联盟,七月算法集训专题
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一道题足矣学习字典树(模板)!
一、1032.字符流(困难)
1.题目描述
2.解题思路
对给出的字符串进行逆序后插入树中,取后缀200个字符,搜索即可。
3.代码演示(C++)
class StreamChecker
{
class TrieNode
{
public:
int end;
TrieNode *next[26];
TrieNode()
{
end = 0;
memset(next, 0, sizeof(next));
}
};
class Trie
{
public:
TrieNode* root;
Trie()
{
root = new TrieNode();
}
void insert(string word)
{
TrieNode *now = root;
for(int i = 0; i < word.size(); ++i)
{
int child = word[i] - 'a';
if( nullptr == now->next[child] )
{
now->next[child] = new TrieNode();
}
now = now->next[child];
}
++now->end;
}
bool search(string word)
{
TrieNode *now = root;
for(int i = 0; i < word.size(); ++i)
{
int child = word[i] - 'a';
if(now->end)
{
return true;
}
if( nullptr == now->next[child])
{
return false;
}
now = now->next[child];
}
return now->end;
}
};
public:
Trie T;
string s;
StreamChecker(vector<string>& words)
{
for(int i = 0; i < words.size(); ++i)
{
reverse(words[i].begin(), words[i].end());
T.insert(words[i]);
}
}
bool query(char letter)
{
s += letter;
string findS = "";
for(int i = s.size()-1; i >= 0; --i)
{
findS += s[i];
if(findS.size() > 200) break;
}
return T.search(findS);
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!