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

सी ++ में स्ट्रिंग को पुनर्गठित करें

मान लीजिए कि हमारे पास एक स्ट्रिंग S है, जांचें कि क्या अक्षरों को फिर से व्यवस्थित किया जा सकता है ताकि दो अक्षर जो एक दूसरे से सटे हों, समान न हों। यदि यह संभव है, तो किसी भी संभावित परिणाम को आउटपुट करें। यदि यह संभव नहीं है, तो खाली स्ट्रिंग लौटाएं। तो अगर इनपुट "एएबी" जैसा है, तो आउटपुट "एबीए" होगा।

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

  • pq नामक पूर्णांक वर्ण युग्मों की एक प्राथमिकता कतार बनाएं, एक मानचित्र m परिभाषित करें
  • n :=स्ट्रिंग का आकार
  • वर्ण आवृत्ति को मानचित्र m में संग्रहीत करें
  • प्रत्येक कुंजी-मान युग्म p के लिए m
    • सम्मिलित करें (p का पूर्णांक भाग, p का वर्ण भाग)
  • उत्तर:=खाली स्ट्रिंग
  • जबकि pq खाली नहीं है
    • एक सेट करें:=pq से शीर्ष जोड़ी, और pq से शीर्ष जोड़ी हटाएं
    • यदि pq खाली है, तो
      • यदि एक> 1 का पूर्णांक भाग है, तो खाली स्ट्रिंग लौटाएं
      • उत्तर:=उत्तर + एक का वर्ण भाग
      • वापसी उत्तर
    • दो :=pq से शीर्ष जोड़ी, और pq से शीर्ष जोड़ी हटाएं
    • उत्तर:=उत्तर + एक का वर्ण भाग
    • उत्तर:=उत्तर + दो का वर्ण भाग
    • एक और दो के पूर्णांक भाग को 1 से बढ़ाएँ
    • यदि एक का पूर्णांक भाग 0 नहीं है, तो एक को pq में सम्मिलित करें
    • यदि दो का पूर्णांक भाग 0 नहीं है, तो एक को pq में डालें
  • वापसी उत्तर

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string reorganizeString(string S) {
      priority_queue <pair <int, char>> pq;
      map <char, int> m;
      int n = S.size();
      for(int i = 0; i < n; i++){
         m[S[i]]++;
      }
      map <char, int> :: iterator i = m.begin();
      while(i != m.end()){
         pq.push({i->second, i->first});
         i++;
      }
      string ans = "";
      while(!pq.empty()){
         pair <int, char> one = pq.top();
         pq.pop();
         if(pq.empty()){
            if(one.first > 1)
            return "";
            ans += one.second;
            return ans;
         }
         pair <int, char> two = pq.top();
         pq.pop();
         ans += one.second;
         ans += two.second;
         //cout << ans << endl;
         one.first--;
         two.first--;
         if(one.first)pq.push(one);
         if(two.first)pq.push(two);
      }
      return ans;
   }
};
int main() {
   Solution ob1;
   cout << ob1.reorganizeString("AAB") << endl;
   return 0;
}

इनपुट

S = "AAB"
ob1.reorganizeString("AAB")

आउटपुट

ABA

  1. C++ का उपयोग करके एक स्ट्रिंग में एक अतिरिक्त वर्ण खोजें।

    मान लीजिए कि हमारे पास दो तार S और T हैं, S की लंबाई n है, और T की लंबाई n + 1 है। T उन सभी वर्णों को धारण करेगा जो S में मौजूद हैं, लेकिन इसमें एक अतिरिक्त वर्ण होगा। हमारा काम कुछ कुशल दृष्टिकोण का उपयोग करके अतिरिक्त चरित्र को खोजना है। इस समस्या को हल करने के लिए, हम एक खाली हैश तालिका लेंगे, औ

  1. सी ++ में एक स्ट्रिंग को टोकन करना

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

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

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