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

सबसे लंबा उपसर्ग खोजने का कार्यक्रम जो C++ में भी एक प्रत्यय है


मान लीजिए कि हमारे पास एक स्ट्रिंग s है, हमें s का सबसे लंबा उपसर्ग ढूंढना है, जो एक प्रत्यय भी है (स्वयं को छोड़कर)। यदि ऐसा कोई उपसर्ग नहीं है, तो बस रिक्त स्ट्रिंग लौटाएं।

इसलिए, यदि इनपुट "मैडम" जैसा है, तो आउटपुट "m" होगा, इसमें स्वयं को छोड़कर 4 उपसर्ग हैं। ये "म", "मा", "मैड", "माडा" और "एम", "एम", "डैम", "एडम" जैसे 4 प्रत्यय हैं। सबसे बड़ा उपसर्ग जो प्रत्यय भी होता है वह "m" द्वारा दिया जाता है।

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

  • एक फ़ंक्शन lps () को परिभाषित करें, इसमें s लगेंगे,

  • n :=s का आकार

  • आकार n के सरणी रिट को परिभाषित करें

  • जे:=0, मैं:=1

  • जबकि मैं

    • यदि s[i] s[j] के समान है, तो -

      • रिट[i] :=j + 1

      • (मैं 1 से बढ़ाइए)

      • (जम्मू को 1 से बढ़ाएं)

    • अन्यथा जब s[i] s[j] के बराबर नहीं है, तो -

      • अगर j> 0, तो -

        • j :=ret[j − 1]

      • अन्यथा

        • (मैं 1 से बढ़ाइए)

  • वापसी रिट

  • मुख्य विधि से निम्न कार्य करें -

  • n :=s का आकार

  • यदि n 1 के समान है, तो -

    • रिक्त स्ट्रिंग लौटाएं

  • एक सरणी परिभाषित करें v =lps(s)

  • x :=v[n − 1]

  • रिट:=खाली स्ट्रिंग

  • इनिशियलाइज़ करने के लिए i:=0, जब i

    • रिट:=रिट + एस[i]

  • वापसी रिट

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   vector <int> lps(string s){
      int n = s.size();
      vector<int> ret(n);
      int j = 0;
      int i = 1;
      while (i < n) {
         if (s[i] == s[j]) {
            ret[i] = j + 1;
            i++;
            j++;
         }
         else if (s[i] != s[j]) {
            if (j > 0)
            j = ret[j - 1];
            else {
               i++;
            }
         }
      }
      return ret;
   }
   string longestPrefix(string s) {
      int n = s.size();
      if (n == 1)
      return "";
      vector<int> v = lps(s);
      int x = v[n - 1];
      string ret = "";
      for (int i = 0; i < x; i++) {
         ret += s[i];
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.longestPrefix("helloworldhello"));
}

इनपुट

"helloworldhello"

आउटपुट

hello

  1. सी ++ में सबसे लंबे समय तक सामान्य अनुक्रम की लंबाई खोजने का कार्यक्रम

    मान लीजिए कि हमारे पास दो स्ट्रिंग्स टेक्स्ट 1 और टेक्स्ट 2 हैं, हमें उनके सबसे लंबे सामान्य बाद की लंबाई का पता लगाना है। जैसा कि हम जानते हैं कि एक स्ट्रिंग के बाद मूल स्ट्रिंग से उत्पन्न एक नई स्ट्रिंग है जिसमें कुछ वर्णों को शेष वर्णों के सापेक्ष क्रम को बदले बिना हटा दिया जाता है। (इसलिए उदाहरण

  1. सी ++ में सबसे लंबे बिटोनिक बाद की लंबाई खोजने का कार्यक्रम

    मान लीजिए हमारे पास संख्याओं की एक सूची है। हमें सबसे लंबे बिटोनिक बाद की लंबाई का पता लगाना है। असवे गाँठ एक अनुक्रम को बिटोनिक कहा जाता है यदि यह सख्ती से बढ़ रहा है और फिर सख्ती से घट रहा है। सख्ती से बढ़ता क्रम बिटोनिक है। या सख्ती से घटने वाला क्रम बिटोनिक भी है। इसलिए, यदि इनपुट अंकों की तरह

  1. पेड़ के स्तर को खोजने के लिए कार्यक्रम जिसमें सी ++ में न्यूनतम योग है

    मान लीजिए हमारे पास एक बाइनरी ट्री है, इसकी जड़ का स्तर 1 है, इसके बच्चों का स्तर 2 है, और इसी तरह। हमें सबसे छोटा स्तर X खोजना है जैसे कि स्तर X पर नोड्स के सभी मानों का योग न्यूनतम हो। तो अगर पेड़ जैसा है - आउटपुट 2 होगा क्योंकि योग 4 - 10 =-6 है, जो न्यूनतम है। इसे हल करने के लिए, हम इन चरणों