链接:https://leetcode.com/problems/stream-of-characters/
思路
query(letter): returns true if and only if for some k >= 1, the last k characters queried (in order from oldest to newest, including this letter just queried) spell one of the words in the given list.
这题query的英文比较难懂,看了半天才明白。总之,就是已query的字符构成一个流(包含正在query的字符),检查这个流里面有没有一个子串,以正在query的字符为末尾,且与之前存入的某个word相等。
将word反向存入Trie即可,存储所有query的字符。
代码
class TrieNode {
public:
vector<TrieNode *> links{26};
bool isEnd = false;
// ~TrieNode() {
// for(auto p : links) {
// if(p) delete p;
// }
// }
};
class StreamChecker {
private:
TrieNode* root = new TrieNode();
vector<char> stream;
public:
// ~StreamChecker() {
// delete root;
// }
StreamChecker(vector<string>& words) {
for(auto &word : words) {
auto p = root;
for(int i = word.size() - 1; i >= 0; i--) {
char c = word[i];
if(p->links[c - 'a']) {
p = p->links[c - 'a'];
} else {
p = p->links[c - 'a'] = new TrieNode();
}
}
p->isEnd = true;
}
}
bool query(char letter) {
stream.push_back(letter);
TrieNode *p = root;
for(int i = stream.size()-1; i >= 0; i--) {
p = p->links[stream[i] - 'a'];
if(!p) return false;
if(p->isEnd) return true;
}
return p->isEnd;
}
};
/**
* Your StreamChecker object will be instantiated and called as such:
* StreamChecker* obj = new StreamChecker(words);
* bool param_1 = obj->query(letter);
*/