मान लीजिए कि हमारे पास एक गैर-रिक्त स्ट्रिंग s और एक पूर्णांक k है; हमें स्ट्रिंग को इस तरह पुनर्व्यवस्थित करना होगा कि समान वर्ण एक दूसरे से कम से कम k दूरी पर हों। दिए गए तार छोटे अक्षरों में हैं। यदि स्ट्रिंग्स को पुनर्व्यवस्थित करने का कोई तरीका नहीं है, तो हम एक खाली स्ट्रिंग करेंगे।
इसलिए, यदि इनपुट s ="aabbcc", k =3 जैसा है, तो आउटपुट "abcabc" होगा, ऐसा इसलिए है क्योंकि समान अक्षर एक दूसरे से कम से कम 3 दूरी पर हैं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
रिट:=एक खाली स्ट्रिंग
-
एक नक्शा परिभाषित करें मी
-
n :=s का आकार
-
इनिशियलाइज़ i:=0 के लिए, जब i
-
(m[s[i]] 1 से बढ़ाएं)
-
-
एक प्राथमिकता कतार pq परिभाषित करें
-
प्रत्येक की-वैल्यू पेयर के लिए इसे m में जोड़ें -
-
अस्थायी:=एक जोड़ी कुंजी और इसके मूल्य के साथ
-
pq में अस्थायी डालें
-
(इसे 1 से बढ़ाएं)
-
-
एक डेक डीक्यू परिभाषित करें
-
जबकि (pq खाली नहीं है), करें -
-
curr :=pq के ऊपर
-
pq से तत्व हटाएं
-
रिट :=रिट + curr.first
-
(कर्र.सेकंड को 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