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

লেক্সিকোগ্রাফিক্যালি স্মলেস্ট ইকুিভ্যালেন্ট স্ট্রিং (C++)

এই সমস্যায় সমান দৈর্ঘ্যের দুটি স্ট্রিং A এবং B দেওয়া আছে। A[i] এবং B[i] একইভাবের (equivalent) ক্যারেক্টার। এই ইকুিভ্যালেন্স রিফ্লেক্সিভ, সিমেট্রিক এবং ট্রানজিটিভ। একটি তৃতীয় স্ট্রিং S দেওয়া আছে, তার লেক্সিকোগ্রাফিক্যালি স্মলেস্ট ইকুিভ্যালেন্ট স্ট্রিং বের করতে হবে।

উদাহরণ

ইনপুট: A = "parker", B = "morris", S = "parser"

আউটপুট: "makkek"

ব্যাখ্যা: গ্রুপগুলো: [m,p], [a,o], [k,r,s], [e,i]। প্রতিটি গ্রুপের সবচেয়ে ছোট ক্যারেক্টার দিয়ে প্রতিস্থাপন করলে "makkek" পাওয়া যায়।

অ্যালগরিদম: ইউনিয়ন-ফাইন্ড (DSU)

  • প্যারেন্ট অ্যারে parent[26] রাখুন, আরম্ভালি -১।
  • getParent(x) — পাথ কমপ্রেশন সহ রুট খুঁজুন।
  • union(a,b) — ছোট ক্যারেক্টারকে রুট বানান।
  • A এবং B-র সব জোড়ায় ইউনিয়ন করুন।
  • S-র প্রতিটি ক্যারেক্টারের রুট খুঁজে ছোট ক্যারেক্টার দিয়ে রিপ্লেস করুন।

C++ প্রোগ্রাম

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

class Solution {
    vector<int> parent;

    int getParent(char x) {
        if (parent[x - 'a'] == -1) return x - 'a';
        return parent[x - 'a'] = getParent('a' + parent[x - 'a']);
    }

    void unionn(char a, char b) {
        int pA = getParent(a), pB = getParent(b);
        if (pA == pB) return;
        if (pA < pB) parent[pB] = pA;
        else parent[pA] = pB;
    }

public:
    string smallestEquivalentString(string A, string B, string S) {
        parent = vector<int>(26, -1);
        for (int i = 0; i < A.size(); i++)
            unionn(A[i], B[i]);

        string ret = "";
        for (char c : S)
            ret += char(getParent(c) + 'a');
        return ret;
    }
};

int main() {
    Solution ob;
    cout << ob.smallestEquivalentString("parker", "morris", "parser");
    return 0;
}

আউটপুট

makkek
  1. C++-এ String at() মেথড ব্যবহার

  2. C++-এ sprintf-এর সমতুল্য: ostringstream

  3. C++-এ স্ট্রিং টোকেনাইজেশন: স্ট্রিম এবং getline() ব্যবহার

  4. C++-এ স্ট্রিং টোকেনাইজ (Tokenize) করা