C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++での文字のストリーム


次のようにStreamCheckerクラスを実装するとします-

  • StreamChecker(words)-これはコンストラクターであり、指定された単語でデータ構造を初期化します。

  • query(letter)-これは、k> =1の場合、クエリされた最後のk文字(クエリされたばかりの文字を含め、古いものから新しいものの順に)が指定されたリストの単語の1つを綴る場合にtrueを返します。

したがって、入力がword list =["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、

    が必要です。
    • curr:=ヘッド

    • 初期化i:=0の場合、i

      • x:=s [i]

      • currのchild[x-'a']がnullでない場合、-

        • curr.child[x-'a']=新しいノードノードを作成します

      • curr:=curr.child [x-'a']

    • isEnd of curr:=true

  • イニシャライザからこれを行います

    • head:=新しいノードを作成する

    • 初期化i:=0の場合、i <単語のサイズの場合、更新(iを1増やします)、実行-

      • insertNode(head、words [i])

    • curr:=ヘッド

  • 関数query()を定義します。これにはxが必要です

    • ノードの1つの配列を一時的にします

    • head.child [x-'a']の場合、-

      • waitListの最後にヘッドを挿入します

    • ret:=false

    • 初期化i:=0の場合、i

      • curr:=waitList [i]

      • curr.child [x-'a']の場合、

        • curr:=currの子[x-'a']

        • 温度の最後にcurrを挿入します

        • ret:=ret OR isEnd of curr

    • 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

  1. C++で最大のBSTサブツリー

    二分木があるとしましょう。その中で最大のサブツリーを見つける必要があります。ここで、最大とは、ノードの数が最も多いサブツリーを意味します。 したがって、入力が次のような場合、 この場合、最大のBSTサブツリーが強調表示されているため、出力は3になります。 これを解決するには、次の手順に従います- データと呼ばれる1つの構造を定義します。サイズ、maxVal、minVal、okの4つの値があり、okはtrue/falseの値のみを保持できます 解決(TreeNode *ノード) ノードがnullの場合、&miuns; 初期化してデータを返す(0、無限大、-無

  2. C++ストリームクラスの構造

    C ++では、ストリームとは、プログラムスレッドとi/oの間で転送される文字のストリームを指します。 ストリームクラス C ++では、ファイルおよびioデバイスの入出力操作に使用されます。これらのクラスには特定の機能があり、プログラムの入出力を処理します。 iostream.h ライブラリは、C++プログラミング言語のすべてのストリームクラスを保持します。 階層を見て、それらについて学びましょう。 それでは、 iostreamのクラスについて学びましょう。 ライブラリ。 iosクラス −このクラスは、すべてのストリームクラスの基本クラスです。ストリームは、入力ストリームまた