C++中的字符流
假设我们想实现如下所示的StreamChecker类:
StreamChecker(words) − 这是构造函数,它使用给定的单词初始化数据结构。
query(letter) − 当对于某些 k >= 1,最后 k 个查询的字符(按照从旧到新的顺序,包括刚刚查询的这个字母)拼写出给定列表中的某个单词时,返回 true。
因此,如果输入类似于单词列表 = ["ce", "g", "lm"],然后对 [a,b,c,e,f,g,h,i,j,k,l,m] 多次调用 query,则输出对于 e、g、m 为 true,对于其他字符为 false。
为了解决这个问题,我们将遵循以下步骤:
定义一个节点结构,其中包含一个大小为 26 的节点数组和一个isEnd标志
最初 isEnd 为 false,子数组填充为 null。
定义一个节点头head
创建一个节点数组waitList
定义一个函数insertNode(),它将接收head和s作为参数。
curr := head
对于初始化 i := 0,当 i < s 的大小,更新(i 增加 1),执行:
x := s[i]
如果 curr 的 child[x - 'a'] 不为 null,则:
curr.child[x - 'a'] = 创建一个新的节点Node
curr := curr.child[x - 'a']
curr 的 isEnd := true
从初始化器执行此操作
head := 创建一个新节点
对于初始化 i := 0,当 i < words 的大小,更新(i 增加 1),执行:
insertNode(head, words[i])
curr := head
定义一个函数 query(),它将接收 x 作为参数。
创建一个节点数组 temp
如果 head.child[x - 'a'],则:
将 head 插入 waitList 的末尾
ret := false
对于初始化 i := 0,当 i < waitList 的大小,更新(i 增加 1),执行:
curr := waitList[i]
如果 curr.child[x - 'a'],则
curr := curr 的 child[x - 'a']
将 curr 插入 temp 的末尾
ret := ret OR curr 的 isEnd
swap(temp, waitList)
返回 ret
让我们看看下面的实现来更好地理解:
示例
#include <bits/stdc++.h> using namespace std; struct Node { Node* child[26]; bool isEnd; Node(){ isEnd = false; for (int i = 0; i < 26; i++) child[i] = NULL; } }; class StreamChecker { public: Node* head; vector<Node*> waitList; void insertNode(Node* head, string& s){ Node* curr = head; for (int i = 0; i < s.size(); i++) { char x = s[i]; if (!curr->child[x - 'a']) { curr->child[x - 'a'] = new Node(); } curr = curr->child[x - 'a']; } curr->isEnd = true; } StreamChecker(vector<string>& words){ head = new Node(); for (int i = 0; i < words.size(); i++) { insertNode(head, words[i]); } Node* curr = head; } bool query(char x){ vector<Node*> temp; if (head->child[x - 'a']) { waitList.push_back(head); } bool ret = false; for (int i = 0; i < waitList.size(); i++) { Node* curr = waitList[i]; if (curr->child[x - 'a']) { curr = curr->child[x - 'a']; temp.push_back(curr); ret |= curr->isEnd; } } swap(temp, waitList); return ret; } }; main(){ vector<string> v = {"ce","g","lm"}; StreamChecker ob(v); cout << (ob.query('a')) << endl; cout << (ob.query('b')) << endl; cout << (ob.query('c')) << endl; cout << (ob.query('e')) << endl; cout << (ob.query('f')) << endl; cout << (ob.query('g')) << endl; cout << (ob.query('h')) << endl; cout << (ob.query('i')) << endl; cout << (ob.query('j')) << endl; cout << (ob.query('k')) << endl; cout << (ob.query('l')) << endl; cout << (ob.query('m')); }
输入
"ce","g","lm", query(),
输出
0 0 0 1 0 1 0 0 0 0 0 1