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

C++ में परम्यूटेशन खोजें - गुप्त हस्ताक्षर से लेक्सिकोग्राफिकली सबसे छोटा


समस्या विवरण

मान लीजिए हमारे पास एक गुप्त हस्ताक्षर है जिसमें वर्ण 'D' और 'I' होते हैं। 'D' दो संख्याओं के बीच घटते संबंध को दर्शाता है, 'I' बढ़ते संबंध को दर्शाता है। यह गुप्त हस्ताक्षर एक विशेष पूर्णांक सरणी द्वारा निर्मित किया गया था, जिसमें 1 से n तक सभी अलग-अलग संख्याएं विशिष्ट रूप से होती हैं।

उदाहरण के लिए, गुप्त हस्ताक्षर "DI" को [2,1,3] या [3,1,2] जैसी सरणी से बनाया जा सकता है, लेकिन [3,2,4] या [2,1,3,4] जैसी सरणी से नहीं, जो दोनों अवैध हैं और "DI" गुप्त हस्ताक्षर का प्रतिनिधित्व नहीं कर सकते।

अब हमें [1, 2, ... n] का लेक्सिकोग्राफिकली सबसे छोटा परम्यूटेशन ढूंढना है जो दिए गए गुप्त हस्ताक्षर को संदर्भित कर सके।

यदि इनपुट "DI" है, तो आउटपुट [2,1,3] होगा। जैसा कि हम जानते हैं [3,1,2] भी "DI" गुप्त हस्ताक्षर का निर्माण कर सकता है, लेकिन चूंकि हमें सबसे छोटे लेक्सिकोग्राफिकल परम्यूटेशन को ढूंढना है, हमें [2,1,3] आउटपुट करना होगा।

समाधान दृष्टिकोण

स्टैक-आधारित दृष्टिकोण का उपयोग करके:

  1. एक स्टैक (st) परिभाषित करें
  2. cnt := 2
  3. एक सरणी ret परिभाषित करें
  4. i को 1 से s के आकार तक लूप करें:
    • यदि s[i-1] == 'D', तो i को st में डालें
    • अन्यथा:
      • i को ret के अंत में डालें
      • जब तक st खाली न हो:
        • st के शीर्ष तत्व को ret के अंत में डालें
        • st से तत्व हटाएं
  5. s के आकार को st में डालें
  6. जब तक st खाली न हो:
    • st के शीर्ष तत्व को ret के अंत में डालें
    • st से तत्व हटाएं
  7. ret लौटाएं

C++ कार्यान्वयन

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

void print_vector(vector<auto> v){ 
    cout << "["; 
    for(int i = 0; i<v.size(); i++){ 
        cout << v[i] << ", "; 
    } 
    cout << "]"<<endl; 
} 

class Solution { 
public: 
    vector<int> findPermutation(string s) { 
        stack <int> st; 
        int cnt = 2; 
        vector <int> ret; 
        for(int i = 1; i <= s.size(); i++){ 
            if(s[i - 1] == 'D'){ 
                st.push(i); 
            } 
            else{ 
                ret.push_back(i); 
                while(!st.empty()){ 
                    ret.push_back(st.top()); 
                    st.pop(); 
                } 
            } 
        } 
        st.push(s.size() + 1); 
        while(!st.empty()){ 
            ret.push_back(st.top()); 
            st.pop(); 
        } 
        return ret; 
    } 
}; 

int main(){ 
    Solution ob; 
    print_vector(ob.findPermutation("DIID")); 
    return 0;
}

इनपुट

"DIID"

आउटपुट

[2, 1, 3, 5, 4, ]
  1. C++ में त्रिभुज का परिमाप खोजें C++ में त्रिभुज का परिमाप खोजें

    इस समस्या में, हम त्रिभुज का परिमाप, विभिन्न प्रकार के त्रिभुजों के परिमाप का सूत्र और उन्हें खोजने के लिए प्रोग्राम देखेंगे।परिमाप को आकृति के चारों ओर की कुल दूरी के रूप में परिभाषित किया गया है। मूल रूप से, यह दी गई आकृति की सभी भुजाओं का योग है।त्रिभुज का परिमापत्रिभुज का परिमाप इसकी सभी तीन भुज

  1. C++ में डुप्लिकेट उपट्री ढूंढना C++ में डुप्लिकेट उपट्री ढूंढना

    मान लीजिए हमारे पास एक बाइनरी ट्री है। हमें सभी डुप्लिकेट उपट्री ढूंढने हैं। इसलिए प्रत्येक प्रकार के डुप्लिकेट उपट्री के लिए, हमें उनमें से किसी एक का रूट नोड लौटाना है। मान लीजिए हमारे पास ऐसा ट्री है: डुप्लिकेट उपट्री हैं: हल का दृष्टिकोण इसे हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:

  1. - C++ प्रोग्राम: GCD (महत्तम समापवर्तक) खोजें

    परिचयदो संख्याओं का महत्तम समापवर्तक (GCD) वह सबसे बड़ी संख्या है जो दोनों को विभाजित करती है। उदाहरण के लिए: मान लें हमारे पास दो संख्याएं हैं 45 और 27। 45 = 5 * 3 * 3 27 = 3 * 3 * 3 इसलिए, 45 और 27 का GCD 9 है। उदाहरण 1 (यूक्लिडियन एल्गोरिदम)#include <iostream> using namespace std; int gcd(