কম্পিউটার টিউটোরিয়াল

C++-এ এলিয়েন ডিকশনারি (Alien Dictionary) সমাধান


ধরি একটি নতুন এলিয়েন ভাষা আছে যা ল্যাটিন অ্যালফাবেট ব্যবহার করে। কিন্তু অক্ষরগুলোর ক্রম অজানা। আমাদের ডিকশনারি থেকে নন-এম্পটি শব্দগুলোর একটি তালিকা দেওয়া আছে, যেগুলো এই নতুন ভাষার নিয়ম অনুযায়ী লেক্সিকোগ্রাফিক্যালি সর্টেড। আমাদের এই ভাষার অক্ষরগুলোর ক্রম বের করতে হবে।

উদাহরণস্বরূপ, ইনপুট ["wrt","wrf","er","ett","rftt"] হলে আউটপুট হবে "wertf"।

সমাধানের ধাপসমূহ

  • দুটি ম্যাপ degree এবং graph সংজ্ঞায়িত।
  • n := words.size()
  • সব শব্দের সব ক্যারেক্টারের জন্য degree[c] = 0
  • i = 0 থেকে n-2:
    • l := min(words[i].size(), words[i+1].size())
    • j = 0 থেকে l-1:
      • x := words[i][j], y := words[i+1][j]
      • যদি x != y:
        • graph[x].push_back(y)
        • degree[y]++
        • ব্রেক
  • ret := খালি স্ট্রিং
  • একটি কিউ q
  • degree-র সব key-value জন্য যদি value == 0: q.push(key)
  • যখন q খালি না:
    • x := q.front(); q.pop()
    • ret += x
    • graph[x]-র সব sit জন্য:
      • degree[sit]--
      • যদি degree[sit] == 0: q.push(sit)
  • ফেরত: (ret.size() == degree.size() ? ret : "")

প্রোগ্রাম উদাহরণ

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    string alienOrder(vector& words) {
        map degree;
        map> graph;
        int n = words.size();
        for (int i = 0; i < words.size(); i++) {
            for (int j = 0; j < words[i].size(); j++) {
                degree[words[i][j]] = 0;
            }
        }
        for (int i = 0; i < n - 1; i++) {
            int l = min((int)words[i].size(), (int)words[i + 1].size());
            for (int j = 0; j < l; j++) {
                char x = words[i][j];
                char y = words[i + 1][j];
                if (x != y) {
                    graph[x].push_back(y);
                    degree[y]++;
                    break;
                }
            }
        }
        string ret = "";
        queue q;
        map::iterator it = degree.begin();
        while (it != degree.end()) {
            if (it->second == 0) {
                q.push(it->first);
            }
            it++;
        }
        while (!q.empty()) {
            char x = q.front();
            q.pop();
            ret += x;
            vector::iterator sit = graph[x].begin();
            while (sit != graph[x].end()) {
                degree[*sit]--;
                if (degree[*sit] == 0) {
                    q.push(*sit);
                }
                sit++;
            }
        }
        return ret.size() == degree.size() ? ret : "";
    }
};

int main() {
    Solution ob;
    vector v = {"wrt","wrf","er","ett","rftt"};
    cout << (ob.alienOrder(v));
}

ইনপুট

{"wrt","wrf","er","ett","rftt"}

আউটপুট

wertf
  1. C++-এ n-এরি ট্রিতে জোড় আকারের সাবট্রি (Even Size Subtree) বের করা

  2. C++-এ fread() ফাংশন

  3. C++-এ অ্যারে ডিকে (Array Decay) কী?

  4. C++-এ sizeof অপারেটর কী?