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

C++ में सबसे लंबा सामान्य अनुगमन

मान लीजिए कि हमारे पास दो स्ट्रिंग्स टेक्स्ट 1 और टेक्स्ट 2 हैं, हमें उनके सबसे लंबे सामान्य बाद की लंबाई वापस करनी होगी। एक स्ट्रिंग के बाद मूल स्ट्रिंग से उत्पन्न एक नई स्ट्रिंग है जिसमें कुछ वर्ण शेष वर्णों के सापेक्ष क्रम को बदले बिना हटा दिए जाते हैं। (इसलिए उदाहरण के लिए "अबे" "एबीसीडीई" का परवर्ती है लेकिन "एडीसी" नहीं है)। दो स्ट्रिंग्स का एक सामान्य अनुवर्ती एक ऐसा क्रम है जो दोनों स्ट्रिंग्स के लिए सामान्य है। इसलिए यदि कोई सामान्य अनुवर्ती नहीं है, तो 0 लौटाएं। यदि इनपुट "abcde", और "ace" जैसा है, तो परिणाम 3 होगा।

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

  • n :=s का आकार, m :=x का आकार

  • यदि या तो n 0 है, या m 0 है, तो वापस 0

  • s :=खाली स्ट्रिंग, s के साथ संयोजित

  • x :=खाली स्ट्रिंग, x के साथ संयोजित

  • रिट:=0

  • क्रम के मैट्रिक्स डीपी को परिभाषित करें (एन + 1) एक्स (एम + 1)

  • मैं के लिए 1 से n की सीमा में

    • j के लिए 1 से m की सीमा में

      • dp[i, j] :=अधिकतम dp[i, j-1] और dp[i-1, j]

      • अगर s[i] =x[j], तो

        • dp[i, j] :=अधिकतम dp[i, j], 1 + dp[i – 1, j – 1]

  • वापसी डीपी [एन, एम]

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int longestCommonSubsequence(string s, string x) {
      int n = s.size();
      int m = x.size();
      if(!n || !m) return 0;
      s = " " + s;
      x = " " + x;
      int ret = 0;
      vector < vector <int> > dp(n + 1, vector <int>(m + 1));
      for(int i = 1; i <= n; i++){
         for(int j = 1; j <= m ; j++){
            dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
            if(s[i] == x[j]) {
               dp[i][j] = max(dp[i][j], 1 + dp[i - 1][j - 1]);
            }
         }
      }
      return dp[n][m];
   }
};
main(){
   Solution ob;
   cout << (ob.longestCommonSubsequence("abcde", "ace"));
}

इनपुट

"abcde"
"ace"

आउटपुट

3

  1. C++ में सबसे लंबे समय तक बढ़ते क्रम की संख्या

    मान लीजिए कि हमारे पास पूर्णांकों की एक क्रमबद्ध श्रेणी नहीं है। हमें सबसे लंबे समय तक बढ़ते क्रम की संख्या ज्ञात करनी है, इसलिए यदि इनपुट [1, 3, 5, 4, 7] जैसा है, तो आउटपुट 2 होगा, क्योंकि बढ़ते क्रम [1,3,5,7] हैं और [1, 3, 4, 7] इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - n :=संख्या सरणी का

  1. सबसे लंबे समय तक सामान्य बाद के लिए सी ++ कार्यक्रम

    एक अनुक्रम तत्वों के सेट के समान क्रम वाला अनुक्रम है। अनुक्रम स्टुव के लिए, अनुवर्ती स्टु, तुव, एसयूवी, .... आदि हैं। लंबाई n की एक स्ट्रिंग के लिए, स्ट्रिंग से अनुवर्ती बनाने के 2n तरीके हो सकते हैं। उदाहरण एबीसीडीजीएच और एईडीएफएचआर स्ट्रिंग्स के लिए सबसे लंबा सामान्य अनुक्रम लंबाई 3 का है। #inc

  1. सी ++ प्रोग्राम अनुक्रमों के एक सेट में सभी अनुक्रमों के लिए सबसे लंबे समय तक सामान्य अनुक्रम खोजने के लिए

    यहां हम अनुक्रमों के एक सेट में सभी अनुक्रमों के लिए सबसे लंबे बाद के सामान्य को खोजने के लिए C++ प्रोग्राम पर चर्चा करेंगे। एल्गोरिदम Begin Take the array of strings as input. function matchedPrefixtill(): find the matched prefix between string s1 and s2 :    n1 = store length of string s