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

更新于:2020年6月4日

476 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告