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

C++ में सबसे लंबा प्रीफिक्स जो सफिक्स भी है ढूंढने का प्रोग्राम

समस्या विवरण

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

उदाहरण के लिए, यदि इनपुट "madam" है, तो आउटपुट "m" होगा, इसके स्वयं को छोड़कर 4 प्रीफिक्स हैं। ये "m", "ma", "mad", "mada" हैं और 4 सफिक्स जैसे "m", "am", "dam", "adam" हैं। सबसे बड़ा प्रीफिक्स जो सफिक्स भी है, "m" द्वारा दिया जाता है।

हल करने का दृष्टिकोण

इस समस्या को हल करने के लिए हम KMP एल्गोरिदम के LPS (लॉन्गेस्ट प्रीफिक्स सफिक्स) ऐरे का उपयोग करेंगे:

  1. एक फंक्शन lps() परिभाषित करें जो s लेता है
  2. n := s का आकार
  3. आकार n का एक ऐरे ret परिभाषित करें
  4. j := 0, i := 1
  5. जब तक i < n:
    • यदि s[i] == s[j], तो ret[i] := j+1, i++, j++
    • अन्यथा जब s[i] != s[j]:
      • यदि j > 0, तो j := ret[j-1]
      • अन्यथा i++
  6. ret वापस करें
  7. मुख्य विधि से:
    • n := s का आकार
    • यदि n == 1, तो खाली स्ट्रिंग वापस करें
    • v = lps(s)
    • x := v[n-1]
    • ret := खाली स्ट्रिंग
    • i := 0 से x-1 तक: ret := ret + s[i]
    • ret वापस करें

उदाहरण

#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;
    }
};

int main() {
    Solution ob;
    cout << (ob.longestPrefix("helloworldhello"));
}

इनपुट

"helloworldhello"

आउटपुट

hello
  1. - C++ में सबसे लंबे सामान्य उपअनुक्रम की लंबाई खोजने का प्रोग्राम

    मान लीजिए हमारे पास दो स्ट्रिंग्स text1 और text2 हैं, हमें उनके सबसे लंबे सामान्य उपअनुक्रम (Longest Common Subsequence - LCS) की लंबाई ज्ञात करनी है। एक उपअनुक्रम वह स्ट्रिंग है जो मूल स्ट्रिंग से कुछ वर्णों को हटाकर (बिना क्रम बदले) बनती है। उदाहरण के लिए, abe abcde का उपअनुक्रम है लेकिन adc नहीं

  1. - C++ में सबसे लंबे बिटोनिक उपअनुक्रम की लंबाई खोजने का प्रोग्राम

    एक अनुक्रम को बिटोनिक कहा जाता है यदि यह पहले सख्ती से बढ़ता है और फिर सख्ती से घटता है। एक पूर्णतः बढ़ता या घटता अनुक्रम भी बिटोनिक माना जाता है। उदाहरण के लिए, सरणी [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15] के लिए सबसे लंबे बिटोनिक उपअनुक्रम की लंबाई 7 है। समाधान दृष्टिकोण हम दो सरणि

  1. C++ में बाइनरी ट्री के उस स्तर को खोजें जिसका योग न्यूनतम है C++ में बाइनरी ट्री के उस स्तर को खोजें जिसका योग न्यूनतम है

    एक बाइनरी ट्री दिया गया है जहां रूट का स्तर 1 है। हमें वह सबसे छोटा स्तर X ढूंढना है जहां सभी नोड्स के मानों का योग न्यूनतम हो। उदाहरण ट्री में रूट 5 है, बाएं 4, दाएं -10, आदि। स्तर 2 का योग 4 + (-10) = -6 है, जो न्यूनतम है, इसलिए आउटपुट 2 है। समाधान दृष्टिकोण हम लेवल ऑर्डर ट्रैवर्सल (BFS) का उपयोग