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

सी++ में पालिंड्रोम सबस्ट्रिंग क्वेरीज़

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

इस ट्यूटोरियल में, हमें सबस्ट्रिंग [L...R] प्रश्नों की स्ट्रिंग str और Q संख्या प्रदान की जाती है, प्रत्येक में दो मान L और R होते हैं। हमारा लक्ष्य एक प्रोग्राम लिखना है जो यह निर्धारित करने के लिए प्रश्नों को हल करेगा कि सबस्ट्रिंग [L] है या नहीं। ..R] एक पालिंड्रोम है। हमें यह तय करना होगा कि एल से आर की सीमा के भीतर गठित सबस्ट्रिंग प्रत्येक प्रश्न को हल करने के लिए एक पैलिंड्रोम है या नहीं। उदाहरण के लिए -

Let's input "abbbabaaaba" as our input string.
The queries were [3, 13], [3, 11], [5, 8], [8, 12]
It is necessary to determine whether the substring is a plaindrome
A palindrome is "abaaabaaaba" (3, 13) .
It is not possible to write "baaa" as a palindrome [3, 11].
As in [5, 8]: "aaab" cannot be a palindrome.
There is a palindrome in "baaab" ([3, 12]).

समाधान खोजने के लिए दृष्टिकोण

बेवकूफ तरीका

यहां, हमें यह जांच कर एक पैलिंड्रोम खोजना होगा कि क्या सबस्ट्रिंग इंडेक्स रेंज एल से आर तक है। इसलिए, हमें सभी सबस्ट्रिंग प्रश्नों को एक-एक करके जांचना होगा और यह निर्धारित करना होगा कि वे पैलिंड्रोम हैं या नहीं। चूंकि Q प्रश्न हैं और प्रत्येक प्रश्न का उत्तर देने में 0(N) समय लगता है। सबसे खराब स्थिति में 0(Q.N) समय लगता है।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
int isPallindrome(string str){
   int i, length;
   int flag = 0;
   length = str.length();
   for(i=0;i < length ;i++){
      if(str[i] != str[length-i-1]) {
         flag = 1; break;
      }
   }
   if (flag==1)
      return 1;
   return 0;
}
void solveAllQueries(string str, int Q, int query[][2]){
   for(int i = 0; i < Q; i++){
      isPallindrome(str.substr(query[i][0] - 1, query[i][1] - 1))?                  cout<<"Palindrome\n":cout<<"Not palindrome!\n";
   }
}
int main() {
   string str = "abccbeba"; int Q = 3;
   int query[Q][2] = {{3, 5}, {5, 7}, {2, 1}};
   solveAllQueries(str, Q, query);
   return 0;
}

आउटपुट

Palindrome
Palindrome
Not palindrome!

गतिशील प्रोग्रामिंग विधि

समस्या को हल करने के लिए एक गतिशील प्रोग्रामिंग दृष्टिकोण का उपयोग करना एक कुशल विकल्प है। हल करने के लिए, हमें एक DP सरणी बनाने की आवश्यकता होगी, जो एक द्वि-आयामी सरणी है जिसमें एक बूलियन मान होता है जो दर्शाता है कि क्या सबस्ट्रिंग[i...j] DP[i][j] के लिए एक पैलिंड्रोम है।

यह DP मैट्रिक्स बनाया जाएगा, और प्रत्येक क्वेरी के लिए सभी L-R मानों की जाँच की जाएगी।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
void computeDP(int DP[][50], string str){
   int length = str.size();
   int i, j;
   for (i = 0; i < length; i++) {
      for (j = 0; j < length; j++)
         DP[i][j] = 0;
   }
   for (j = 1; j <= length; j++) {
      for (i = 0; i <= length - j; i++) {
         if (j <= 2) {
            if (str[i] == str[i + j - 1])
               DP[i][i + j - 1] = 1;
         }
         else if (str[i] == str[i + j - 1])
            DP[i][i + j - 1] = DP[i + 1][i + j - 2];
      }
   }
}
void solveAllQueries(string str, int Q, int query[][2]){
   int DP[50][50];
   computeDP(DP, str);
   for(int i = 0; i < Q; i++){
      DP[query[i][0] - 1][query[i][1] - 1]?cout
      <<"not palindrome!\n":cout<<"palindrome!\n";
   }
}
int main() {
   string str = "abccbeba"; int Q = 3;
   int query[Q][2] = {{3, 5}, {5, 7}, {2, 1}};
   solveAllQueries(str, Q, query);
   return 0;
}

आउटपुट

palindrome!
not palindrome!
palindrome!

निष्कर्ष

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


  1. C++ में बार-बार सबस्ट्रिंग पैटर्न

    मान लीजिए कि हमारे पास एक गैर-रिक्त स्ट्रिंग है। हमें यह जांचना होगा कि क्या इसका एक सबस्ट्रिंग लेकर और सबस्ट्रिंग के कई बार जोड़कर इसका निर्माण किया जा सकता है। स्ट्रिंग में केवल लोअरकेस अंग्रेजी अक्षर होते हैं और इसकी लंबाई 10000 से अधिक नहीं होगी। इसलिए यदि इनपुट अबाबाबा जैसा है, तो उत्तर सही होग

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

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

  1. सी ++ में सबस्ट्रिंग

    एक सबस्ट्रिंग एक स्ट्रिंग का एक भाग है। सी ++ में सबस्ट्रिंग प्राप्त करने के लिए एक फ़ंक्शन सबस्ट्र () है। इस फ़ंक्शन में दो पैरामीटर हैं:पॉज़ और लेन। पॉज़ पैरामीटर सबस्ट्रिंग की प्रारंभ स्थिति को निर्दिष्ट करता है और लेन एक सबस्ट्रिंग में वर्णों की संख्या को दर्शाता है। एक प्रोग्राम जो C++ में सबस