ধরুন আমাদের একটি অ-খালি স্ট্রিং s এবং একটি পূর্ণসংখ্যা k আছে; আমাদের স্ট্রিংটিকে এমনভাবে সাজাতে হবে যাতে একই অক্ষরগুলি একে অপরের থেকে কমপক্ষে k দূরত্বে থাকে। প্রদত্ত স্ট্রিংগুলি ছোট হাতের অক্ষরে রয়েছে। যদি স্ট্রিংগুলিকে পুনর্বিন্যাস করার কোন উপায় না থাকে, তাহলে আমরা একটি খালি স্ট্রিং করব।
সুতরাং, যদি ইনপুটটি s ="aabbcc", k =3 এর মত হয়, তাহলে আউটপুট হবে "abcabc" কারণ একই অক্ষরগুলি একে অপরের থেকে কমপক্ষে 3 দূরত্বে থাকে।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
ret :=একটি খালি স্ট্রিং
-
একটি মানচিত্র m
সংজ্ঞায়িত করুন -
n :=s
এর আকার -
আরম্ভ করার জন্য i :=0, যখন i
-
(m[s[i]] 1 দ্বারা বৃদ্ধি করুন)
-
-
একটি অগ্রাধিকার সারি pq
সংজ্ঞায়িত করুন -
প্রতিটি কী-মানের জন্য এটিকে m তে যুক্ত করুন, −
করুন-
temp :=কী এবং এর মান সহ একটি জোড়া
-
pq
-এ তাপমাত্রা সন্নিবেশ করান -
(এটি 1 দ্বারা বাড়ান)
-
-
একটি deque dq
সংজ্ঞায়িত করুন -
যখন (pq খালি নয়), −
করুন-
curr :=pq এর শীর্ষ
-
pq
থেকে উপাদান মুছুন -
ret :=ret + curr.first
-
(curr.second 1 দ্বারা কমিয়ে দিন)
-
dq
এর শেষে curr সন্নিবেশ করান -
যদি dq>=k এর আকার হয়, তাহলে −
-
curr :=dq এর প্রথম উপাদান
-
dq
থেকে সামনের উপাদান মুছুন -
যদি curr.second> 0 হয়, তাহলে −
-
pq
-এ curr ঢোকান
-
-
-
-
যখন (dq খালি নয় এবং dq-এর প্রথম উপাদান 0 এর মতো), করো −
-
dq
থেকে সামনের উপাদান মুছুন
-
-
রিটার্ন করুন (যদি dq খালি হয়, তারপর রিট করুন, অন্যথায় ফাঁকা স্ট্রিং)
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h> using namespace std; struct Comparator { bool operator()(pair<char, int> a, pair<char, int> b) { return !(a.second > b.second); } }; class Solution { public: string rearrangeString(string s, int k) { string ret = ""; unordered_map<char, int> m; int n = s.size(); for (int i = 0; i < n; i++) { m[s[i]]++; } unordered_map<char, int>::iterator it = m.begin(); priority_queue<pair<char, int<, vector<pair<char, int>>, Comparator> pq; while (it != m.end()) { pair<char, int> temp = {it->first, it->second}; pq.push(temp); it++; } deque<pair<char, int>> dq; while (!pq.empty()) { pair<char, int> curr = pq.top(); pq.pop(); ret += curr.first; curr.second--; dq.push_back(curr); // cout << ret << " " << dq.size() << endl; 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 : ""; } }; main() { Solution ob; cout << (ob.rearrangeString("aabbcc", 3)); }
ইনপুট
"aabbcc", 3
আউটপুট
bacbac