Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

स्ट्रिंग को k दूरी पर पुनर्व्यवस्थित करें - C++


मान लीजिए हमारे पास एक गैर-खाली स्ट्रिंग s और एक पूर्णांक k है; हमें स्ट्रिंग को इस तरह पुनर्व्यवस्थित करना है कि समान वर्ण एक-दूसरे से कम से कम दूरी k पर हों। दी गई स्ट्रिंग्स लोअरकेस अक्षरों में हैं। यदि स्ट्रिंग्स को पुनर्व्यवस्थित करने का कोई तरीका नहीं है, तो हम एक खाली स्ट्रिंग लौटाएंगे।

तो, यदि इनपुट s = "aabbcc", k = 3 जैसा है, तो आउटपुट "abcabc" होगा क्योंकि समान अक्षर एक-दूसरे से कम से कम दूरी 3 पर हैं।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे −

  • ret := एक खाली स्ट्रिंग

  • एक मैप m परिभाषित करें

  • n := s का आकार

  • i := 0 से आरंभ करें, जब i < n, अद्यतन करें (i को 1 से बढ़ाएं), करें −

    • (m[s[i]] को 1 से बढ़ाएं)

  • एक प्राथमिकता कतार pq परिभाषित करें

  • m में प्रत्येक कुंजी-मान जोड़ी it के लिए, करें −

    • temp := it की कुंजी और मान के साथ एक जोड़ी

    • temp को pq में डालें

    • (it को 1 से बढ़ाएं)

  • एक डीक्यू dq परिभाषित करें

  • जब तक (pq खाली नहीं है), करें −

    • curr := pq का शीर्ष

    • pq से तत्व हटाएं

    • ret := ret + curr.first

    • (curr.second को 1 से घटाएं)

    • curr को dq के अंत में डालें

    • यदि dq का आकार >= k, तो −

      • curr := dq का पहला तत्व

      • dq से पहला तत्व हटाएं

      • यदि curr.second > 0, तो −

        • curr को pq में डालें

  • जब तक (dq खाली नहीं है और dq का पहला तत्व 0 के समान है), करें −

    • dq से पहला तत्व हटाएं

  • लौटाएं (यदि dq खाली है, तो ret, अन्यथा खाली स्ट्रिंग)

उदाहरण  

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें −

#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

  1. - C++ में String at() फंक्शन

    सारांश यह संक्षिप्त ट्यूटोरियल स्ट्रिंग से कैरेक्टर्स के अनुक्रम को एक्सेस करने के लिए C++ स्ट्रिंग क्लास at() फंक्शनैलिटी का अवलोकन है। आगामी सेक्शन में, एक इच्छुक पाठक स्ट्रिंग क्लास प्रोग्रामिंग उदाहरणों के माध्यम से at() फंक्शन्स के मैनिपुलेशन की पूरी समझ प्राप्त कर सकता है। स्ट्रिंग क्लास प्रोग

  1. - C++ में स्ट्रिंग को टोकनाइज़ करना

    इस खंड में, हम देखेंगे कि C++ में स्ट्रिंग्स को कैसे टोकनाइज़ किया जाए। C में हम कैरेक्टर सरणी के लिए strtok() फंक्शन का उपयोग कर सकते हैं। यहां हमारे पास एक स्ट्रिंग क्लास है। अब हम देखेंगे कि उस स्ट्रिंग से किसी डिलीमीटर का उपयोग करके स्ट्रिंग को कैसे काटा जाए। C++ सुविधा का उपयोग करने के लिए, हम

  1. - C++ में स्ट्रिंग को टोकनाइज़ कैसे करें?

    पहला तरीका शब्दों को स्पेस से अलग करके पढ़ने के लिए stringstream का उपयोग करना है। यह थोड़ा सीमित है लेकिन अगर आप उचित चेक प्रदान करते हैं तो यह कार्य काफी अच्छी तरह से करता है। उदाहरण #include <vector> #include <string> #include <sstream> using namespace std; int main() {