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

C++ में विशिष्ट उपअनुक्रमों की गणना


मान लीजिए हमारे पास दो स्ट्रिंग्स S और T हैं। हमें S के उन विशिष्ट उपअनुक्रमों की संख्या गिननी है जो T के बराबर हों।

हम जानते हैं कि किसी स्ट्रिंग का उपअनुक्रम (subsequence) एक नई स्ट्रिंग होती है जो मूल स्ट्रिंग से कुछ कैरेक्टर्स (शून्य भी हो सकते हैं) को हटाकर बनती है, बिना शेष कैरेक्टर्स की सापेक्ष स्थिति को बदले। (जैसे, "ACE" "ABCDE" का उपअनुक्रम है जबकि "AEC" नहीं)।

यदि इनपुट स्ट्रिंग्स "baalllloonnn" और "balloon" हैं, तो चयन के 36 अलग-अलग तरीके होंगे।

हल करने का दृष्टिकोण

इस समस्या को हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:

  • n := S का आकार, m := T का आकार। S और T को शुरुआत में एक खाली स्थान जोड़कर अपडेट करें।
  • (n + 1) x (m + 1) आकार का एक मैट्रिक्स बनाएं।
  • dp[0][0] := 1 सेट करें, फिर सभी पंक्तियों के 0वें कॉलम के लिए 1 सेट करें।
  • i को 1 से n तक लूप चलाएं:
    • j को 1 से m तक लूप चलाएं:
      • यदि S[i] == T[j], तो dp[i][j] := dp[i-1][j-1]
      • dp[i][j] := dp[i][j] + dp[i-1][j]
  • dp[n][m] वापस करें।

उदाहरण (C++ कोड)

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

#include <bits/stdc++.h> 
using namespace std; 
typedef long long int lli; 
class Solution { 
public: 
    int numDistinct(string s, string t) { 
        int n = s.size(); 
        int m = t.size(); 
        s = " " + s; 
        t = " " + t; 
        vector< vector<lli>> dp(n + 1, vector<lli> (m + 1)); 
        dp[0][0] = 1; 
        for(int i = 1; i <= n; i++) dp[i][0] = 1; 
        for(int i = 1; i <= n; i++){ 
            for(int j = 1; j <= m; j++){ 
                if(s[i] == t[j]) dp[i][j] = dp[i - 1][j - 1]; 
                dp[i][j] += dp[i - 1][j]; 
            } 
        } 
        return dp[n][m]; 
    } 
}; 
int main(){ 
    Solution ob; 
    cout << (ob.numDistinct("baalllloonnn", "balloon")); 
}

इनपुट

"baalllloonnn" "balloon"

आउटपुट

36
  1. - C++ में सभी बढ़ते हुए सबसीक्वेंस गिनें

    इस ट्यूटोरियल में, हम बढ़ते हुए अनुक्रमों की संख्या खोजने के लिए एक प्रोग्राम पर चर्चा करेंगे।इसके लिए हमें 0 से 9 तक के अंकों वाला एक ऐरे प्रदान किया जाएगा। हमारा कार्य ऐरे में मौजूद सभी अनुक्रमों को गिनना है जैसे कि अगला एलिमेंट पिछले एलिमेंट से बड़ा हो।उदाहरण#include<bits/stdc++.h> using na

  1. - C++ में स्ट्रिंग के सभी उपअनुक्रम प्रिंट करें

    इस समस्या में, हमें एक स्ट्रिंग दी गई है और हमें स्ट्रिंग के सभी उपअनुक्रम प्रिंट करने हैं। उत्पन्न उपस्ट्रिंग स्ट्रिंग के तत्वों को हटाकर बनाई जाती है लेकिन क्रम वही रहता है (अर्थात क्रम बदला नहीं जा सकता)। विषय को बेहतर ढंग से समझने के लिए एक उदाहरण लेते हैं - इनपुट: xyz आउटपुट: x,y,z,xy,yz,xz,xyz

  1. - C++ में सॉर्टेड एरे में निरपेक्ष विशिष्ट गिनती

    एक एरे समान डेटा प्रकार के तत्वों का एक संग्रह है। एक सॉर्टेड एरे एक एरे है जिसमें तत्व आरोही या अवरोही क्रम के अनुक्रम में संग्रहीत होते हैं। विशिष्ट गिनती उन तत्वों की संख्या है जो समान नहीं हैं। निरपेक्ष विशिष्ट गिनती तत्वों के निरपेक्ष मान की विशिष्ट गिनती है यानी चिह्न के बिना मान (अनसाइन्ड मा