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

C++ में पलिंड्रोम सबस्ट्रिंग को बार-बार हटाने के बाद एक स्ट्रिंग को हटाने के लिए न्यूनतम कदम

समस्या कथन

केवल पूर्णांक के रूप में वर्णों वाली एक स्ट्रिंग को देखते हुए। हमें इस स्ट्रिंग के सभी वर्णों को कम से कम चरणों में हटाने की आवश्यकता है जहां एक चरण में हम सबस्ट्रिंग को हटा सकते हैं जो एक पैलिंड्रोम है। एक सबस्ट्रिंग को हटाने के बाद शेष भागों को जोड़ दिया जाता है।

उदाहरण

यदि इनपुट स्ट्रिंग 3441213 है तो न्यूनतम 2 चरणों की आवश्यकता है

  • सबसे पहले स्ट्रिंग से 121 को हटा दें। अब शेष स्ट्रिंग 3443 है
  • शेष स्ट्रिंग को पैलिंड्रोम के रूप में निकालें

एल्गोरिदम

हम इस समस्या को हल करने के लिए गतिशील प्रोग्रामिंग का उपयोग कर सकते हैं

1. Let dp[i][j] denotes the number of steps it takes to delete the substring s[i, j]
2. Each character will be deleted alone or as part of some substring so in the first case we will delete the character itself and call subproblem (i+1, j)
3. In the second case we will iterate over all occurrence of the current character in right side, if K is the index of one such occurrence then the problem will reduce to two subproblems (i+1, K – 1) and (K+1, j)
4. We can reach to this subproblem (i+1, K-1) because we can just delete the same character and call for mid substring
5. We need to take care of a case when first two characters are same in that case we can directly reduce to the subproblem (i+2, j)

उदाहरण

#include <bits/stdc++.h>
using namespace std;
int getMinRequiredSteps(string str) {
   int n = str.length();
   int dp[n + 1][n + 1];
   for (int i = 0; i <= n; i++) {
      for (int j = 0; j <= n; j++) {
         dp[i][j] = 0;
      }
   }
   for (int len = 1; len <= n; len++) {
      for (int i = 0, j = len - 1; j < n; i++, j++) {
         if (len == 1)
            dp[i][j] = 1;
         else {
            dp[i][j] = 1 + dp[i + 1][j];
            if (str[i] == str[i + 1]) {
               dp[i][j] = min(1 + dp[i+ 2][j], dp[i][j]);
            }
            for (int K = i + 2; K <= j; K++){
               if (str[i] == str[K]) {
                  dp[i][j] =
                  min(dp[i+1][K-1] + dp[K+1][j], dp[i][j]);
               }
            }
         }
      }
   }
   return dp[0][n - 1];
}
int main() {
   string str = "3441213";
   cout << "Minimum required steps: " <<
   getMinRequiredSteps(str) << endl;
   return 0;
}

जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्न आउटपुट उत्पन्न करता है

आउटपुट

Minimum required steps: 2

  1. C++ में पूर्णांकों की एक स्ट्रिंग में 6 से विभाज्य सबस्ट्रिंग की संख्या

    हम एक समस्या को देखेंगे जिसमें हमें एक पूर्णांक स्ट्रिंग दी गई है और यह निर्धारित करना होगा कि पूर्णांक प्रारूप में कितने सबस्ट्रिंग 6 से विभाज्य हैं। यह ध्यान दिया जाना चाहिए कि इनपुट संख्याओं (पूर्णांक) से बने स्ट्रिंग के रूप में है। फिर भी, विभाज्यता जांच इसे केवल एक पूर्णांक के रूप में मानते हुए

  1. सी ++ में एक स्ट्रिंग में पहला दोहराया शब्द खोजें

    इस समस्या में, हम अल्पविराम से अलग किए गए शब्दों से मिलकर एक स्ट्रिंग स्ट्रिंग हैं। हमारा काम है एक स्ट्रिंग में दोहराए गए पहले शब्द को ढूंढना । हमें स्ट्रिंग में दोहराए जाने वाले पहले शब्द दो रिक्त स्थान के बीच की स्ट्रिंग को खोजने की जरूरत है। समस्या को समझने के लिए एक उदाहरण लेते हैं, Input :

  1. C++ का उपयोग करके एक स्ट्रिंग के सबस्ट्रिंग की संख्या ज्ञात करें

    इस लेख में, आप किसी दिए गए स्ट्रिंग में बनाए जा सकने वाले सबस्ट्रिंग (गैर-रिक्त) की संख्या को खोजने के तरीकों के बारे में जानेंगे। Input : string = “moon” Output : 10 Explanation: Substrings are ‘m’, ‘o’, ‘o’, ‘n’, ‘mo’, &lsqu