কম্পিউটার

C++ এ ওয়ার্ড স্কোয়ার


ধরুন আমাদের কাছে শব্দের একটি সেট আছে (সবগুলোই অনন্য), আমাদের সব শব্দের বর্গ খুঁজে বের করতে হবে এবং আমরা সেগুলি থেকে তৈরি করতে পারি। এখানে শব্দের একটি ক্রম একটি বৈধ শব্দ বর্গ গঠন করে যদি kth সারি এবং কলাম একই স্ট্রিংটি পড়ে, যেখানে 0 ≤ k <সর্বাধিক numRows এবং numColumns। সুতরাং একটি উদাহরণ হিসাবে, শব্দের ক্রম ["বল","এরিয়া","লিড","লেডি"] একটি শব্দ বর্গক্ষেত্র তৈরি করবে কারণ প্রতিটি শব্দ অনুভূমিকভাবে এবং উল্লম্বভাবে একইভাবে পড়ে।

b a l l
a r e a
l e a d
l a d y

সুতরাং, যদি ইনপুটটি ["এরিয়া","লিড","ওয়াল","লেডি","বল"] এর মত হয়, তাহলে আউটপুট হবে [[ "ওয়াল", "এরিয়া" , "লিড", "লেডি"], ["বল", "এরিয়া", "লিড", "লেডি"]]

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • একটি নোড গঠন সংজ্ঞায়িত করুন, একটি পরিবর্তনশীল isEnd এবং চাইল্ড নোডগুলির একটি তালিকা থাকবে

  • একটি 2D অ্যারে ret সংজ্ঞায়িত করুন

  • একটি ফাংশন সংজ্ঞায়িত করুন insertNode(), এটি হেড, s,

    লাগবে
  • নোড :=হেড

  • আরম্ভ করার জন্য i :=0, যখন i

    • x :=s[i]

    • যদি নোডের চাইল্ড অ্যারে খালি থাকে, তাহলে −

      • নোডের শিশু [x] :=নতুন নোড

    • নোড :=নোডের শিশু[x]

  • isEnd of node :=true

  • getAllWords নামে একটি ফাংশন সংজ্ঞায়িত করুন, এটি idx, উপসর্গ নোড এবং টেম্প অ্যারে নেবে

  • যদি নোড খালি থাকে, তাহলে -

    • ফেরত

  • যদি নোডের শেষটি সত্য হয়, তাহলে -

    • টেম্পের শেষে curr ঢোকান

    • ফেরত

  • যদি idx>=উপসর্গের আকার হয়, তাহলে −

    • প্রতিটি নোডের জন্য এটি নোডের চাইল্ড-

      • getAllWords(idx, উপসর্গ, it.second, temp, curr + it.first)

  • অন্যথা -

    • x :=উপসর্গ[idx]

    • যদি নোডের সন্তান খালি না হয়, তাহলে −

      • ফেরত

    • getAllWords(idx + 1, উপসর্গ, নোডের শিশু[x], temp, curr + x)

  • একটি ফাংশন সল্ভ(), এটি একটি অ্যারে টেম্প, idx, reqSize, হেড,

    নেবে।
  • যদি idx reqSize এর মত হয়, তাহলে −

    • ret-এর শেষে temp সন্নিবেশ করুন

    • ফেরত

  • উপসর্গ :=খালি স্ট্রিং

  • আরম্ভ করার জন্য i :=0, যখন i

    • উপসর্গ :=উপসর্গ + তাপমাত্রা[i, idx]

  • সম্ভাব্য একটি অ্যারে সংজ্ঞায়িত করুন

  • curr =মাথা

  • getAllWords(0, উপসর্গ, curr, সম্ভব)

  • আরম্ভ করার জন্য i :=0, যখন i <সম্ভবের আকার, আপডেট করুন (i 1 দ্বারা বাড়ান), করবেন −

    • s :=সম্ভব[i]

    • টেম্পের শেষে s ঢোকান

    • সমাধান (temp, idx + 1, reqSize, head)

    • temp

      থেকে শেষ উপাদান মুছুন
  • প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -

  • head =নতুন নোড

  • আরম্ভ করার জন্য i :=0, যখন i <শব্দের আকার, আপডেট (i 1 দ্বারা বৃদ্ধি), −

    • insertNode(head, words[i])

  • একটি অ্যারের তাপমাত্রা সংজ্ঞায়িত করুন

  • আরম্ভ করার জন্য i :=0, যখন i <শব্দের আকার, আপডেট (i 1 দ্বারা বৃদ্ধি), −

    • s :=শব্দ[i]

    • টেম্পের শেষে s ঢোকান

    • সমাধান (temp, 1, শব্দের আকার[0], head)

    • temp

      থেকে শেষ উপাদান মুছুন
  • রিটার্ন রিটার্ন

উদাহরণ

আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto>> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
struct Node {
   bool isEnd;
   map<char, Node *> child;
};
class Solution {
public:
   vector<vector<string>> ret;
   void insertNode(Node *head, string &s) {
      Node *node = head;
      for (int i = 0; i < s.size(); i++) {
         char x = s[i];
         if (!node->child[x]) {
            node->child[x] = new Node();
         }
         node = node->child[x];
      }
      node->isEnd = true;
   }
   void getAllWords(int idx, string prefix, Node *node, vector<string>&temp,
      string curr = "") {
         if (!node)
            return;
         if (node->isEnd) {
            temp.push_back(curr);
            return;
         }
         if (idx >= prefix.size()) {
            for (auto &it : node->child) {
               getAllWords(idx, prefix, it.second, temp, curr + it.first);
            }
         }
         else {
            char x = prefix[idx];
            if (!node->child[x])
               return;
            getAllWords(idx + 1, prefix, node->child[x], temp, curr + x);
         }
   }
   void solve(vector<string> &temp, int idx, int reqSize, Node *head){
      if (idx == reqSize) {
         ret.push_back(temp);
         return;
      }
      string prefix = "";
      for (int i = 0; i < temp.size(); i++) {
         prefix += temp[i][idx];
      }
      vector<string> possible;
      Node *curr = head;
      getAllWords(0, prefix, curr, possible);
      for (int i = 0; i < possible.size(); i++) {
         string s = possible[i];
         temp.push_back(s);
         solve(temp, idx + 1, reqSize, head);
         temp.pop_back();
      }
   }
   vector<vector<string>> wordSquares(vector<string> &words) {
      ret.clear();
      Node *head = new Node();
      for (int i = 0; i < words.size(); i++) {
         insertNode(head, words[i]);
      }
      vector<string> temp;
      for (int i = 0; i < words.size(); i++) {
         string s = words[i];
         temp.push_back(s);
         solve(temp, 1, (int)words[0].size(), head);
         temp.pop_back();
      }
      return ret;
   }
};
main() {
   Solution ob;
   vector<string> v = {"area", "lead", "wall", "lady", "ball"};
   print_vector(ob.wordSquares(v));
}

ইনপুট

{"area", "lead", "wall", "lady", "ball"}

আউটপুট

[[wall, area, lead, lady, ],[ball, area, lead, lady, ],]

  1. C++-এ BST II-তে Inorder Successor

  2. C++ এ একটি আয়তক্ষেত্রে বর্গক্ষেত্রের সংখ্যা গণনা করুন

  3. C++ এ বিকে ট্রি পরিচিতি

  4. C++ এ BST-তে নোড মুছুন