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

C++-এ স্ট্রিং পুনর্বিন্যাস করা যাতে একই ক্যারেক্টারগুলো কমপক্ষে k দূরত্বে থাকে


ধরি আমাদের একটি খালি নন-স্ট্রিং s এবং একটি পূর্ণসংখ্যা k আছে। আমাদের স্ট্রিংটি পুনর্বিন্যাস (rearrange) করতে হবে যাতে একই ক্যারেক্টারগুলো একে অপরের থেকে কমপক্ষে দূরত্ব k এ থাকে। স্ট্রিংগুলো ছোট হাতের অক্ষরে। যদি কোনো উপায়ে পুনর্বিন্যাস করা না যায়, তবে খালি স্ট্রিং ফেরত দেবে।

উদাহরণস্বরূপ, s = "aabbcc", k = 3 হলে আউটপুট হবে "abcabc" কারণ একই অক্ষরগুলো একে অপরের থেকে কমপক্ষে ৩ দূরত্বে আছে।

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

  • ret := খালি স্ট্রিং
  • একটি ম্যাপ m সংজ্ঞায়িত।
  • n := s.size()
  • i = 0 থেকে n-1: m[s[i]]++
  • একটি প্রায়োরিটি কিউ pq সংজ্ঞায়িত।
  • m-র প্রতিটি key-value pair জন্য: pair(key, value) pq-তে পুশ।
  • একটি ডিকিউ (deque) dq সংজ্ঞায়িত।
  • যখন pq খালি না:
    • curr := pq.top(); pq.pop()
    • ret += curr.first
    • curr.second--
    • curr-কে dq-তে পুশ_ব্যাক
    • যদি dq.size() >= k:
      • curr := dq.front(); dq.pop_front()
      • যদি curr.second > 0: curr-কে pq-তে পুশ
  • যখন dq খালি না এবং dq.front().second == 0: dq.pop_front()
  • ফেরত: (dq.empty() ? ret : "")

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

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

struct Comparator {
    bool operator()(pair a, pair b) {
        return !(a.second > b.second);
    }
};

class Solution {
public:
    string rearrangeString(string s, int k) {
        string ret = "";
        unordered_map m;
        int n = s.size();
        for (int i = 0; i < n; i++) {
            m[s[i]]++;
        }
        unordered_map::iterator it = m.begin();
        priority_queue, vector>, Comparator> pq;
        while (it != m.end()) {
            pair temp = {it->first, it->second};
            pq.push(temp);
            it++;
        }
        deque> dq;
        while (!pq.empty()) {
            pair curr = pq.top();
            pq.pop();
            ret += curr.first;
            curr.second--;
            dq.push_back(curr);
            if (dq.size() >= k) {
                curr = dq.front();
                dq.pop_front();
                if (curr.second > 0)
                    pq.push(curr);
            }
        }
        while (!dq.empty() && dq.front().second == 0)
            dq.pop_front();
        return dq.empty() ? ret : "";
    }
};

int main() {
    Solution ob;
    cout << (ob.rearrangeString("aabbcc", 3));
}

ইনপুট

"aabbcc", 3

আউটপুট

bacbac
  1. C++-এ স্ট্রিং ডিকোড করা

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

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

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