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

C++-এ স্ব্যাপ দিয়ে সবচেয়ে ছোট স্ট্রিং পাওয়া

মান লিজিয়ে আমাদের একটি স্ট্রিং s দেওয়া আছে, এবং ইনডেক্সের জোড়ার একটি অ্যারে pairs যেখানে pairs[i] = [a, b] নির্দেশ করে স্ট্রিং-এর ২টি ইনডেক্স (0-ইন্ডেক্সড)। আমরা দেওয়া pairs-এ যেকোনো জোড়া ইনডেক্সের ক্যারেক্টার গুলো যেকোনো সংখ্যকবার স্ব্যাপ করতে পারি। আমাদের স্ব্যাপ ব্যবহার করে s কে যেটি লেক্সিকোগ্রাফিক্যালি সবচেয়ে ছোট স্ট্রিং-এ পরিবর্তন করা সম্ভব সেটি বের করতে হবে।

উদাহরণস্বরূপ, যদি ইনপুট হয় s = "dcab" এবং pairs = [[0,3], [1,2]], তবে আউটপুট হবে "bacd"। s[0] এবং s[3] এক্সচেঞ্জ করলে s = "bcad", তারপর s[1] এবং s[2] এক্সচেঞ্জ করলে s = "bacd"।

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

  • n := অ্যারের সাইজ, parent := সাইজ n-এর একটি অ্যারে, এটিকে -1 দিয়ে ফিল করুন
  • ret নামক একটি স্ট্রিং তৈরি করুন সাইজ n এবং এটিকে * দিয়ে ফিল করুন
  • for i in range 0 to size of pairs:
    • u := pairs[i, 0] এবং v := pairs[i, 1]
    • যদি u এবং v-এর parent একই হয়, তবে পরবর্তী ইটারেশনে যান
    • parent[parent of u] := parent of v
  • arr1 নামক একটি অ্যারে ডিফাইন করুন সাইজ n
  • for i in range 0 to n – 1: s[i] কে arr[parent of i]-তে ইনসার্ট করুন
  • for i in range 0 to n – 1: arr[i] কে ডান পাশ থেকে পড়ে সর্ট করুন
  • for i in range 0 to n – 1:
    • ret[i] := arr1[parent of i]-এর শেষ এন্ট্রি
    • arr1[parent of i]-এর শেষ নোড ডিলিট করুন

উদাহরণ (C++)

বेहतर বোঝার জন্য নিচের ইমপ্লিমেন্টেশন দেখুন -

class Solution {
public:
    vector <int> parent;
    int getParent(int x){
        if(parent[x] == -1) return x;
        return parent[x] = getParent(parent[x]);
    }
    string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
        int n = s.size();
        parent = vector <int>(n, -1);
        string ret(n, '*');
        for(int i = 0; i < pairs.size(); i++){
            int u = pairs[i][0];
            int v = pairs[i][1];
            if(getParent(u) == getParent(v)) continue;
            parent[getParent(u)] = getParent(v);
        }
        vector < char > arr1[n];
        for(int i = 0; i < n; i++){
            arr1[getParent(i)].push_back(s[i]);
        }
        for(int i = 0; i < n; i++){
            sort(arr1[i].rbegin(), arr1[i].rend());
        }
        for(int i = 0; i < n; i++){
            ret[i] = arr1[getParent(i)].back();
            arr1[getParent(i)].pop_back();
        }
        return ret;
    }
};

ইনপুট

"dcab" [[0,3],[1,2]]

আউটপুট

"bacd"
  1. C++-এ থ্রেশহোল্ড দূরত্বে সবচেয়ে কম প্রতিবেশী город খুঁজে বের করা

  2. C/C++-এ স্ট্রিং ইন্টিজার কিনা চেক করা

  3. C++-এ স্ট্রিংকে int-এ পার্স করা (String to Int)

  4. C++-এ int কে string-এ রূপান্তর (Integer to String)