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

सी++ में पलिंड्रोम पार्टिशनिंग III

मान लीजिए कि हमारे पास एक स्ट्रिंग s है जिसमें लोअरकेस अक्षर और एक पूर्णांक k है। हमें कुछ संपत्तियों को बनाए रखना होगा। ये हैं -

  • सबसे पहले, हमें s के कुछ अक्षरों (यदि आवश्यक हो) को अन्य लोअरकेस अंग्रेजी अक्षरों में बदलना होगा।
  • फिर स्ट्रिंग s को k सबस्ट्रिंग में इस तरह विभाजित करें कि प्रत्येक सबस्ट्रिंग एक पैलिंड्रोम हो।

स्ट्रिंग को विभाजित करने के लिए हमें कम से कम वर्णों को बदलना होगा जिन्हें हमें बदलने की आवश्यकता है।

तो अगर स्ट्रिंग "एबैब" और के =2 की तरह है, तो उत्तर 1 होगा, क्योंकि हमें इसे दो पैलिंड्रोम स्ट्रिंग्स में विभाजित करने के लिए एक वर्ण को बदलना होगा। इसलिए यदि हम c को b में बदलते हैं, या दूसरे अंतिम b को c में बदलते हैं, तो हम एक पैलिंड्रोम प्राप्त कर सकते हैं जैसे या तो "bbb" या "cbc", और दूसरा पैलिंड्रोम "aba" है।

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

  • आकार का एक सरणी मेमो परिभाषित करें:105 x 105।
  • एक फ़ंक्शन को हल करें () को परिभाषित करें, इसमें s, idx, k, एक 2D सरणी> dp,
  • लगेगा।
  • यदि idx, s के आकार के समान है, तो −
    • वापसी तब करें जब k 0 हो तो 0 अन्यथा 1000
  • यदि मेमो[idx][k] -1 के बराबर नहीं है, तो −
    • वापसी ज्ञापन[idx][k]
  • यदि k <=0, तो −
    • वापसी की जानकारी
  • उत्तर:=जानकारी
  • इनिशियलाइज़ i :=idx के लिए, जब i
  • Ans :=न्यूनतम उत्तर और dp[idx][i] + फ़ंक्शन को हल करें (s, i + 1, k-1, dp)
  • रिटर्न मेमो[idx][k] =ans
  • मुख्य विधि से, निम्न कार्य करें
  • n :=आकार का
  • मेमो को -1 से भरें
  • एक 2D सरणी dp आकार n x n परिभाषित करें
  • इनिशियलाइज़ l :=2 के लिए, जब l <=n, अपडेट करें (l को 1 से बढ़ाएँ), −
      करें
    • इनिशियलाइज़ करने के लिए i :=0, j :=l-1, जब j
    • यदि l 2 के समान है, तो −
    • dp[i][j] :=true जब s[i] s[j] के समान नहीं है
    • अन्यथा
      • dp[i][j] :=dp[i + 1][j-1] + 0 जब s[i] s[j] के समान हो
  • रिटर्न सॉल्व(s, 0, k, dp)
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
    public:
       int memo[105][105];
       lli solve(string s, int idx, int k, vector < vector <int> > &dp){
          if(idx == s.size()) {
             return k == 0? 0 : 1000;
          }
          if(memo[idx][k] != -1) return memo[idx][k];
          if(k <= 0)return INT_MAX;
          lli ans = INT_MAX;
          for(int i = idx; i < s.size(); i++){
             ans = min(ans, dp[idx][i] + solve(s, i + 1, k - 1, dp));
          }
          return memo[idx][k] = ans;
       }
       int palindromePartition(string s, int k) {
          int n = s.size();
          memset(memo, -1, sizeof(memo));
          vector < vector <int> > dp(n, vector <int>(n));
          for(int l =2; l <= n; l++){
             for(int i = 0, j = l - 1; j <n; j++, i++){
                if(l==2){
                   dp[i][j] = !(s[i] == s[j]);
                }else{
                   dp[i][j] = dp[i+1][j-1] + !(s[i] == s[j]);
                }
             }
          }
          return solve(s, 0, k, dp);
       }
    };
    main(){
       Solution ob;
       cout << (ob.palindromePartition("ababbc", 2));
    }

    इनपुट

    “ababbc”

    आउटपुट

    1

    1. C++ में एक पालिंड्रोम तोड़ें

      मान लीजिए कि हमारे पास एक पैलिंड्रोमिक स्ट्रिंग पैलिंड्रोम है, हमें ठीक एक वर्ण को किसी भी लोअरकेस अंग्रेजी अक्षर से बदलना होगा ताकि स्ट्रिंग लेक्सिकोग्राफ़िक रूप से सबसे छोटी संभव स्ट्रिंग बन जाए जो पैलिंड्रोम नहीं है। अब ऐसा करने के बाद, हमें अंतिम स्ट्रिंग ढूंढनी होगी। यदि ऐसा करने का कोई तरीका न

    1. सी++ में पैलिंड्रोम विभाजन

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

    1. जाँच करें कि C++ में कोई संख्या पालिंड्रोम है या नहीं

      यहां हम देखेंगे कि कैसे जांचा जाता है कि कोई संख्या पैलिंड्रोम है या नहीं। दोनों दिशाओं में पैलिंड्रोम नंबर समान हैं। उदाहरण के लिए, संख्या 12321 पैलिंड्रोम है, लेकिन 12345 पैलिंड्रोम नहीं है। तर्क बहुत सीधा है। हमें संख्या को उल्टा करना है, और यदि उलटी संख्या वास्तविक संख्या के समान है, तो वह एक प