假设我们要实现StreamChecker类,如下所示:
StreamChecker(words)-这是构造函数,它将使用给定的单词初始化数据结构。
query(letter)-对于某些k> = 1,当查询的最后k个字符(按从最早到最新的顺序,包括刚刚查询的字母)拼写给定列表中的一个单词时,此方法返回true。
因此,如果输入像单词列表= [“ ce”,“ g”,“ lm”],则多次调用查询[a,b,c,e,f,g,h,i,j,k ,l,m],则输出对于e,g,m为true,对于其他人为false。
为了解决这个问题,我们将遵循以下步骤-
定义一个节点结构,有26个节点的数组,并且isEnd标志
最初,isEnd为false,并且子数组填充为null。
定义节点头
制作节点数组waitList
定义一个函数insertNode()
,将取head,s,
x:= s [i]
如果curr的child [x-'a']不为空,则-
curr:= curr.child [x-'a']
curr.child [x-'a'] =创建一个新节点
curr:=头
对于初始化i:= 0,当i <s的大小时,更新(将i增加1),执行-
的isEnd:= true
从初始化程序执行此操作
insertNode(head,words [i])
head:=创建一个新节点
对于初始化i:= 0,当i <字长时,更新(将i增加1),执行-
curr:=头
定义一个函数query()
,这将需要x,
curr:= waitList [i]
如果curr.child [x-'a'],则
curr:= curr的子级[x-'a']
在临时结束时插入curr
ret:= ret OR curr isEnd
将头插入waitList的末尾
使一个节点阵列成为临时节点
如果head.child [x-'a'],则-
ret:=错误
对于初始化i:= 0,当i <waitList的大小时,更新(将i增加1),执行-
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