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

सबसे लंबा पैलिंड्रोमिक सबस्ट्रिंग


किसी दिए गए स्ट्रिंग में, हमें एक सबस्ट्रिंग ढूंढनी है, जो एक पैलिंड्रोम है और यह सबसे लंबी है।

सबसे लंबी पैलिंड्रोमिक सबस्ट्रिंग प्राप्त करने के लिए, हमें कई उप-समस्याओं को हल करना होगा, कुछ उप-समस्याएं अतिव्यापी हैं। उन्हें कई बार हल करने की आवश्यकता होती है। उस कारण से, डायनेमिक प्रोग्रामिंग मददगार है। तालिका का उपयोग करके, हम पिछली उप-समस्याओं के परिणामों को संग्रहीत कर सकते हैं, और बस उनका उपयोग आगे के परिणाम उत्पन्न करने के लिए कर सकते हैं।

इनपुट और आउटपुट

Input:
A String. Say “thisispalapsiti”
Output:
The palindrome substring and the length of the palindrome.
Longest palindrome substring is: ispalapsi
Length is: 9

एल्गोरिदम

findLongPalSubstr(str)

इनपुट - मुख्य स्ट्रिंग।

आउटपुट - सबसे लंबा पैलिंड्रोमिक सबस्ट्रिंग और इसकी लंबाई।

Begin
   n := length of the given string
   create a n x n table named palTab to store true or false value
   fill patTab with false values
   maxLen := 1

   for i := 0 to n-1, do
      patTab[i, i] = true       //as it is palindrome of length 1
   done

   start := 0
   for i := 0 to n-2, do
      if str[i] = str[i-1], then
         palTab[i, i+1] := true
         start := i
         maxLen := 2
   done

   for k := 3 to n, do
      for i := 0 to n-k, do
         j := i + k – 1
         if palTab[i+1, j-1] and str[i] = str[j], then
            palTab[i, j] := true
            if k > maxLen, then
               start := i
               maxLen := k
      done
   done
   display substring from start to maxLen from str, and return maxLen
 End

उदाहरण

#include<iostream>
using namespace std;

int findLongPalSubstr(string str) {
   int n = str.size();        // get length of input string
 
   bool palCheckTab[n][n];    //true when substring from i to j is palindrome
   
   for(int i = 0; i<n; i++)
      for(int j = 0; j<n; j++)
         palCheckTab[i][j] = false;      //initially set all values to false
 
   int maxLength = 1;
   
   for (int i = 0; i < n; ++i)
      palCheckTab[i][i] = true;       //as all substring of length 1 is palindrome
 
   int start = 0;
   for (int i = 0; i < n-1; ++i) {
      if (str[i] == str[i+1]) {      //for two character substring both characters are equal
         palCheckTab[i][i+1] = true;
         start = i;
         maxLength = 2;
      }
   }
 
   for (int k = 3; k <= n; ++k) {       //for substrings with length 3 to n
      for (int i = 0; i < n-k+1 ; ++i) {
         int j = i + k - 1;
         if (palCheckTab[i+1][j-1] && str[i] == str[j]) {    //if (i,j) and (i+1, j-1) are same, then check palindrome
            palCheckTab[i][j] = true;
            if (k > maxLength) {
               start = i;
               maxLength = k;
            }
         }
      }
   }
   cout << "Longest palindrome substring is: " << str.substr(start, maxLength) << endl;
   return maxLength; // return length
}
 
int main() {
   char str[] = "thisispalapsiti";
   cout << "Length is: "<< findLongPalSubstr(str);
}

आउटपुट

Longest palindrome substring is: ispalapsi
Length is: 9

  1. पायथन में सबसे लंबे पैलिंड्रोमिक सबस्ट्रिंग की लंबाई खोजने का कार्यक्रम

    मान लीजिए कि हमारे पास एक स्ट्रिंग S है। हमें S में सबसे लंबे पैलिंड्रोमिक सबस्ट्रिंग की लंबाई का पता लगाना है। हम मान रहे हैं कि स्ट्रिंग S की लंबाई 1000 है। इसलिए यदि स्ट्रिंग BABAC है, तो सबसे लंबा पैलिंड्रोमिक सबस्ट्रिंग BAB है। और लंबाई 3 है। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  1. पायथन में सबसे लंबा पालिंड्रोमिक सबस्ट्रिंग

    मान लीजिए कि हमारे पास एक स्ट्रिंग S है। हमें S में सबसे लंबी पैलिंड्रोमिक सबस्ट्रिंग ढूंढनी है। हम मान रहे हैं कि स्ट्रिंग S की लंबाई 1000 है। इसलिए यदि स्ट्रिंग BABAC है , तो सबसे लंबा पैलिंड्रोमिक सबस्ट्रिंग “BAB” है। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे स्ट्रिंग की लंबाई के समान क्रम

  1. सबसे लंबे समय तक सामान्य सबस्ट्रिंग के लिए पायथन में सीक्वेंसमैचर।

    दो स्ट्रिंग्स को देखते हुए, हमारा काम सबसे लंबी कॉमन सब-स्ट्रिंग को प्रिंट करना है। हम SequenceMatcher.find_longest_match () विधि का उपयोग करके अजगर में समस्या का समाधान करेंगे। Class difflib.SequenceMatcher किसी भी प्रकार के अनुक्रमों के जोड़े की तुलना करने के लिए एक लचीला वर्ग है, जब तक कि अनुक्र