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
数据结构
网络
关系数据库管理系统(RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP