Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ में वर्णों की धारा

मान लीजिए कि हम StreamChecker वर्ग को इस प्रकार लागू करना चाहते हैं -

  • StreamChecker(words) - यह कंस्ट्रक्टर है, यह दिए गए शब्दों के साथ डेटा संरचना को इनिशियलाइज़ करता है।

  • query(letter) - यह तब सही होता है जब कुछ k>=1 के लिए, अंतिम k वर्णों के लिए पूछताछ की जाती है (सबसे पुराने से नवीनतम तक, इस पत्र को शामिल करने के क्रम में) दी गई सूची में से किसी एक शब्द की वर्तनी होती है।

इसलिए, यदि इनपुट शब्द सूची =["सीई", "जी", "एलएम"] की तरह है, तो [ए, बी, सी, ई, एफ, जी, एच, आई, जे, के लिए कई बार कॉल करें ,l,m], तो आउटपुट e, g, m, और अन्य के लिए गलत होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • एक नोड संरचना को परिभाषित करें, 26 नोड्स की एक सरणी है, और अंत ध्वज है

  • प्रारंभ में isEnd गलत है, और चाइल्ड सरणी शून्य से भरी हुई है।

  • नोड हेड परिभाषित करें

  • नोड्स की एक सरणी प्रतीक्षा सूची बनाएं

  • एक फ़ंक्शन इन्सर्टनोड () को परिभाषित करें, यह सिर लेगा, s,

    • वक्र:=सिर

    • इनिशियलाइज़ करने के लिए i:=0, जब i

      • एक्स:=एस [i]

      • अगर बच्चे [x - 'a'] का curr शून्य नहीं है, तो -

        • curr.child[x - 'a'] =एक नया नोड नोड बनाएं

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

    • isEnd of curr :=true

  • प्रारंभकर्ता से ऐसा करें

    • सिर :=एक नया नोड बनाएं

    • इनिशियलाइज़ i :=0 के लिए, जब i <शब्दों का आकार, अपडेट (i 1 से बढ़ाएँ), करें -

      • insertNode(सिर, शब्द[i])

    • वक्र:=सिर

  • फ़ंक्शन क्वेरी () को परिभाषित करें, इसमें x लगेगा,

    • नोड्स अस्थायी की एक सरणी बनाएं

    • अगर head.child[x - 'a'], तो -

      • प्रतीक्षा सूची के अंत में सिर डालें

    • रिट :=असत्य

    • प्रारंभ करने के लिए मैं:=0, जब मैं <प्रतीक्षा सूची का आकार, अद्यतन (मैं 1 से बढ़ाएँ), करते हैं -

      • वक्र:=प्रतीक्षा सूची [i]

      • अगर curr.child[x - 'a'], तो

        • curr :=बच्चा [x - 'a'] curr का

        • अस्थायी के अंत में curr डालें

        • ret :=ret OR isEnd of curr

    • स्वैप (अस्थायी, प्रतीक्षासूची)

    • वापसी रिट

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#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. सी++ में सबसे बड़ा बीएसटी सबट्री

    मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें इसका सबसे बड़ा सबट्री ढूंढ़ना होगा जहां सबसे बड़ा मतलब सबट्री जिसमें सबसे बड़ी संख्या में नोड्स हों। तो, अगर इनपुट पसंद है, तो आउटपुट 3 होगा, क्योंकि इस मामले में सबसे बड़ा बीएसटी सबट्री हाइलाइट किया गया है। इसे हल करने के लिए, हम इन चरणों का पालन करे

  1. सी ++ स्ट्रीम क्लास स्ट्रक्चर

    C++ स्ट्रीम में प्रोग्राम थ्रेड और i/o के बीच स्थानांतरित वर्णों की धारा को संदर्भित करता है। स्ट्रीम कक्षाएं सी ++ में फाइलों और आईओ उपकरणों पर इनपुट और आउटपुट ऑपरेशंस के लिए उपयोग किया जाता है। इन वर्गों में विशिष्ट विशेषताएं हैं और कार्यक्रम के इनपुट और आउटपुट को संभालने के लिए। iostream.h पुस्

  1. C++ में ट्रिग्राफ

    ISO-646 कैरेक्टर सेट में C सिंटैक्स के सभी कैरेक्टर नहीं होते हैं, इसलिए कीबोर्ड और डिस्प्ले के साथ कुछ सिस्टम हैं जो कुछ कैरेक्टर के साथ डील नहीं कर सकते हैं। इन वर्णों को ट्रिग्राफ नामक 3 वर्णों के अनुक्रम का उपयोग करके बनाया जा सकता है। सी में, किसी भी अन्य प्रसंस्करण से पहले, तीन वर्णों (ट्रिग्र