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

सी ++ में सबसे छोटा सामान्य सुपरसीक्वेंस

मान लीजिए कि हमारे पास दो स्ट्रिंग्स str1 और str2 हैं, हमें सबसे छोटी स्ट्रिंग ढूंढनी है जिसमें str1 और str2 दोनों बाद के रूप में हों। एक से अधिक परिणाम हो सकते हैं, इसलिए हम उनमें से केवल एक को ही लौटाएंगे।

जैसा कि आप जानते हैं कि एक स्ट्रिंग एस को स्ट्रिंग टी के बाद कहा जाता है यदि टी से कुछ वर्णों को हटा दिया जाता है (संभवतः 0, और अक्षर टी से कहीं भी चुने जाते हैं) परिणाम स्ट्रिंग एस में होता है।

इसलिए, यदि इनपुट "acab", "bac" जैसा है, तो आउटपुट "bacab" होगा, ऐसा इसलिए है क्योंकि दो दिए गए तार इसके बाद के हैं।

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

  • getLCS() फ़ंक्शन को परिभाषित करें, इसमें s1, s2,

    लगेगा
  • रिट:=खाली स्ट्रिंग

  • n :=s1 का आकार, m :=s2 का आकार

  • एक 2D सरणी dp आकार (n + 1) x (m + 1) परिभाषित करें

  • मैं :=n, j :=m

  • s1 :=s1 से पहले रिक्त स्ट्रिंग को संयोजित करें

  • s2 :=s2 से पहले रिक्त स्ट्रिंग को संयोजित करें

  • इनिशियलाइज़ i :=1 के लिए, जब i <=n, अपडेट करें (i को 1 से बढ़ाएँ), करें -

    • इनिशियलाइज़ j :=1 के लिए, जब j <=m, अपडेट करें (j को 1 से बढ़ाएँ), करें -

      • अगर s1[i] s2[j] के समान है, तो -

        • dp[i, j] :=1 + dp[i-1, j-1]

      • अन्यथा

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

  • जबकि (i गैर-शून्य है और j गैर-शून्य है), करें -

    • अगर dp[i, j] dp[i - 1, j] के समान है, तो -

      • (i 1 से घटाएं)

      • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

    • अगर dp[i, j] dp[i, j-1] के समान है, तो -

      • (j को 1 से घटाएं)

      • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

    • रिट :=रिट + s1[i]

    • (i 1 से घटाएं)

    • (j को 1 से घटाएं)

  • सरणी को उलट दें रिट

  • वापसी रिट

  • मुख्य विधि से निम्न कार्य करें -

  • s3 :=getLCS(str1, str2)

  • ret :=खाली स्ट्रिंग, i :=0, j :=0, k :=0

  • जबकि k

    • अगर i

      • रिट :=रिट + str1[i]

      • (मैं 1 से बढ़ाइए)

      • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

    • अगर j

      • रिट :=रिट + str2[j]

      • (जम्मू को 1 से बढ़ाएं)

      • निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं

    • रिट :=रिट + s3[k]

    • (i, j, k को 1 से बढ़ाएं)

  • जबकि मैं

    • रिट :=रिट + str1[i]

    • (मैं 1 से बढ़ाइए)

  • जबकि j

    • रिट :=रिट + str2[j]

    • (जम्मू को 1 से बढ़ाएं)

  • वापसी रिट

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string shortestCommonSupersequence(string str1, string str2){
      string s3 = getLCS(str1, str2);
      string ret = "";
      int i = 0;
      int j = 0;
      int k = 0;
      while (k < s3.size()) {
         if (i < str1.size() && str1[i] != s3[k]) {
            ret += str1[i];
            i++;
            continue;
         }
         if (j < str2.size() && str2[j] != s3[k]) {
            ret += str2[j];
            j++;
            continue;
         }
         ret += s3[k];
         k++;
         i++;
         j++;
      }
      while (i < str1.size()) {
         ret += str1[i];
         i++;
      }
      while (j < str2.size()) {
         ret += str2[j];
         j++;
      }
      return ret;
   }
   string getLCS(string s1, string s2){
      string ret = "";
      int n = s1.size();
      int m = s2.size();
      vector<vector<int> > dp(n + 1, vector<int>(m + 1));
      int i = n;
      int j = m;
      s1 = " " + s1;
      s2 = " " + s2;
      for (int i = 1; i <= n; i++) {
         for (int j = 1; j <= m; j++) {
            if (s1[i] == s2[j]) {
               dp[i][j] = 1 + dp[i - 1][j - 1];
            } else {
               dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
         }
      }
      while (i && j) {
         if (dp[i][j] == dp[i - 1][j]) {
            i--;
            continue;
         }
         if (dp[i][j] == dp[i][j - 1]) {
            j--;
            continue;
         }
         ret += s1[i];
         i--;
         j--;
      }
      reverse(ret.begin(), ret.end());
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.shortestCommonSupersequence("acab", "bac"));
}

इनपुट

"acab", "bac"

आउटपुट

bacab

  1. सी++ में जंप गेम वी

    मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी है जिसे arr और एक पूर्णांक d कहा जाता है। एक चरण में हम इंडेक्स i से − . पर जा सकते हैं i + x जहां:i + x

  1. C++ में K अंक हटाएं

    मान लीजिए कि हमारे पास एक गैर-ऋणात्मक पूर्णांक संख्या है जिसे एक स्ट्रिंग के रूप में दर्शाया गया है, हमें संख्या से k अंक निकालना होगा ताकि नई संख्या सबसे छोटी संभव हो। तो अगर इनपुट “1432219” और k =3 जैसा है, तो परिणाम “1219” होगा। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - स्टैक सेंट को पर

  1. C++ . में चार भाजक

    मान लीजिए कि हमारे पास एक पूर्णांक सरणी संख्या है, हमें उस सरणी में पूर्णांकों के भाजक का योग ज्ञात करना होगा जिसमें ठीक चार भाजक हों। तो अगर सरणी में ऐसा कोई पूर्णांक नहीं है, तो 0 लौटाएं। उदाहरण के लिए, यदि इनपुट [21, 4, 7] है, तो आउटपुट 32 होगा, क्योंकि 21 में चार भाजक हैं 1, 3, 7, 21, 4 में तीन