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

मैनाचर का एल्गोरिदम


एक स्ट्रिंग से सबसे लंबा पालिंड्रोमिक सबस्ट्रिंग ढूंढने के लिए, हम मैनाचर के एल्गोरिदम का उपयोग कर सकते हैं। प्रत्येक कैरेक्टर को चुनकर, हम बाएं और दाएं पॉइंटर का उपयोग करके जांचने का प्रयास करेंगे कि क्या कोई पालिंड्रोम है। जानकारी स्टोर करने के लिए एक और ऐरे है, उस जानकारी से हम आसानी से ढूंढ सकते हैं कि पालिंड्रोम कितना लंबा है। प्रत्येक कैरेक्टर के लिए, ऐरे जानकारी स्टोर करेगा। पूरे स्ट्रिंग को ट्रैवर्स करने के बाद, हम बनाए गए ऐरे से सबसे लंबा पालिंड्रोमिक सबसीक्वेंस ढूंढ सकते हैं।

इस एल्गोरिदम की समय जटिलता O(n) है।

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

इनपुट: स्ट्रिंग: "levelup" आउटपुट: सबसे लंबा पालिंड्रोम है: level

एल्गोरिदम

longestPalindrome(text)

इनपुट - सबसे लंबा पालिंड्रोम ढूंढने के लिए टेक्स्ट

आउटपुट - टेक्स्ट में सबसे लंबा कॉमन पालिंड्रोम

Begin 
  n := text size 
  if n = 0, then 
    return null string 
  n := 2n+1 
  define array longPal of size n 
  longPal[0] := 0 and longPal[1] := 1 
  centerIndex := 1 
  rightIndex := 2 
  right := 0 
  maxPalLength := 0 
  maxCenterIndex := 0 
  start := -1 and end := -1, diff := -1 
  for right := 2 to n-1, do 
    left := 2*centerIndex – right 
    longPal[right] := 0 
    diff := rightIndex – right 
    if diff > 0, then 
      longPal[right] := minimum(longPal[left], diff) 
      while (right + longPal[right]) < n AND (right - longPal[right]) > 0 AND 
        (right + longPal[right]+1)mod 2 = 0 OR 
        text[(right + longPal[right] + 1)/2] = text[(right - longPal[right]-1)/2], do 
        increase longPal[right] by 1 
      done 
    if longPal[right] > maxPalLength, then 
      maxPalLength := longPal[right] 
      maxCenterIndex := right 
    if (right + longPal[right]) > rightIndex, then 
      centerIndex := right 
      rightIndex := right + longPal[right] 
  done 
  start := (maxCenterIndex – maxPalLength)/2 
  end := start + maxPalLength – 1 
  palindrome = substring of text[start..end] 
  return palindrome 
End

उदाहरण

#include<iostream> using namespace std; int min(int a, int b) { return (a 0) longPal[right] = min(longPal[left], diff); while ( ((right + longPal[right]) < n && (right - longPal[right]) > 0) && ( ((right + longPal[right] + 1) % 2 == 0) || (mainString[(right + longPal[right] + 1)/2] == mainString[(right - longPal[right] - 1)/2] ))) { longPal[right]++; } if(longPal[right] > maxPalLength) { //max palindrome length maxPalLength = longPal[right]; maxCenterIndex = right; } if (right + longPal[right] > rightIndex) { centerIndex = right; rightIndex = right + longPal[right]; } } start = (maxCenterIndex - maxPalLength)/2; end = start + maxPalLength - 1; string palindrome; for(int i=start; i<=end; i++) palindrome += mainString[i]; return palindrome; } int main(int argc, char *argv[]) { string mainString, palindrome; cout << "Enter String:"; cin >> mainString; palindrome = longestPalindrome(mainString); cout << "Longest palindrome is: " << palindrome << endl; }

आउटपुट

Enter String: levelup Longest palindrome is: level
  1. फोर्ड-फुल्करसन एल्गोरिदम फोर्ड-फुल्करसन एल्गोरिदम

    फोर्ड-फुल्करसन एल्गोरिदम का उपयोग दिए गए ग्राफ में प्रारंभ शीर्ष से सिंक शीर्ष तक अधिकतम प्रवाह का पता लगाने के लिए किया जाता है। इस ग्राफ में, प्रत्येक किनारे की क्षमता होती है। दो शीर्ष दिए गए हैं जिन्हें स्रोत और सिंक नाम दिया गया है। स्रोत शीर्ष में सभी जावक किनारे होते हैं, कोई आवक किनारा नहीं

  1. फ्लॉयड वार्शल एल्गोरिदम फ्लॉयड वार्शल एल्गोरिदम

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

  1. - मैट्रिक्स गुणन एल्गोरिदम

    इस खंड में हम देखेंगे कि दो मैट्रिक्स को कैसे गुणा किया जाए। मैट्रिक्स गुणन केवल तभी किया जा सकता है जब यह शर्त पूरी होती है। मान लीजिए दो मैट्रिक्स A और B हैं, और उनके आयाम A (m x n) और B (p x q) हैं तो परिणाम मैट्रिक्स तभी पाया जा सकता है जब n = p। तब परिणाम मैट्रिक्स C का क्रम (m x q) होगा।एल्गोर