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

C++ में सभी शब्दों के संयोजन वाला सबस्ट्रिंग


मान लीजिए हमारे पास एक स्ट्रिंग s है, और हमारे पास शब्दों की एक सूची भी है, ऐरे में मौजूद सभी शब्द समान लंबाई के हैं। हमें s में उन सभी सबस्ट्रिंग्स के प्रारंभिक सूचकांक ढूंढने हैं जो words में प्रत्येक शब्द का ठीक एक बार बिना किसी बीच के कैरेक्टर्स के संयोजन हैं।

यदि इनपुट "barfoothefoobarman" है और शब्द ["foo", "bar"] हैं, तो आउटपुट [0,9] होगा। ऐसा इसलिए है क्योंकि इंडेक्स 0 और 9 से शुरू होने वाले सबस्ट्रिंग्स "barfoo" और "foobar" हैं।

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

इस समस्या को हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:

  • ok() नामक एक विधि परिभाषित करें, जो स्ट्रिंग s, मैप wordCnt, और n लेती है
  • s की एक कॉपी temp में बनाएं
  • i को n से s के आकार - 1 तक लूप चलाएं:
    • यदि temp का आकार n का गुणक है, तो:
      • यदि temp, wordCnt में मौजूद नहीं है, तो false वापस करें
      • अन्यथा:
        • यदि wordCnt[temp] 1 है, तो temp को wordCnt से हटाएं, temp को खाली स्ट्रिंग सेट करें
        • अन्यथा wordCnt[temp] के मान को 1 घटाएं, temp को खाली स्ट्रिंग सेट करें।
    • temp को s[i] से बढ़ाएं
  • यदि temp, wordCnt में नहीं है, तो false वापस करें
  • अन्यथा:
    • यदि wordCnt[temp] 1 है, तो temp को wordCnt से हटाएं, temp को खाली स्ट्रिंग सेट करें
    • अन्यथा wordCnt[temp] के मान को 1 घटाएं, temp को खाली स्ट्रिंग सेट करें।
  • wordCnt का आकार 0 होने पर true वापस करें
  • मुख्य विधि से, यह करें:
    • यदि a का आकार 0 है, या b का आकार 0 है, तो खाली ऐरे वापस करें
    • wordCnt नामक एक मैप बनाएं, b में मौजूद स्ट्रिंग्स की आवृत्ति को wordCnt में स्टोर करें
    • ans नामक एक ऐरे बनाएं
    • window := शब्दों की संख्या x प्रत्येक शब्द में कैरेक्टर्स की संख्या
    • स्ट्रिंग a की एक कॉपी temp में बनाएं
    • i को window से a के आकार - 1 तक लूप चलाएं:
      • यदि temp का आकार window से विभाज्य है और ok(temp, wordCnt, b[0] का आकार) कॉल करें, तो:
        • i - window को ans में डालें
      • a[i] को temp में डालें
      • यदि temp का आकार > window, तो सबस्ट्रिंग को 0, 1 से हटाएं
    • यदि temp का आकार window से विभाज्य है और ok(temp, wordCnt, b[0] का आकार) कॉल करें, तो:
      • a का आकार - window को ans में डालें
    • ans वापस करें

उदाहरण (C++ कोड)

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

#include <bits/stdc++.h> 
using namespace std; 
void print_vector(vector<auto> v){ 
    cout << "["; 
    for(int i = 0; i < v.size(); i++){ 
        cout << v[i] << ", "; 
    } 
    cout << "]"<<endl; 
} 
class Solution { 
public: 
    bool ok(string s, unordered_map<string, int> wordCnt, int n){ 
        string temp = ""; 
        for(int i = 0; i < n; i++){ 
            temp += s[i]; 
        } 
        for(int i = n; i < s.size(); i++){ 
            if(temp.size() % n == 0){ 
                if(wordCnt.find(temp) == wordCnt.end()) return false; 
                else{ 
                    if(wordCnt[temp] == 1){ 
                        wordCnt.erase(temp); 
                        temp = ""; 
                    } 
                    else{ 
                        wordCnt[temp]--; 
                        temp = ""; 
                    } 
                } 
            } 
            temp += s[i]; 
        } 
        if(wordCnt.find(temp) == wordCnt.end()) return false; 
        else{ 
            if(wordCnt[temp] == 1){ 
                wordCnt.erase(temp); 
                temp = ""; 
            } 
            else{ 
                wordCnt[temp]--; 
                temp = ""; 
            } 
        } 
        return wordCnt.size() == 0; 
    } 
    vector<int> findSubstring(string a, vector<string> &b) { 
        if(a.size() == 0 || b.size() == 0) return {}; 
        unordered_map<string, int> wordCnt; 
        for(int i = 0; i < b.size(); i++) wordCnt[b[i]]++; 
        vector<int> ans; 
        int window = b.size() * b[0].size(); 
        string temp = ""; 
        for(int i = 0; i < window; i++) temp += a[i]; 
        for(int i = window; i < a.size(); i++){ 
            if(temp.size() % window == 0 && ok(temp, wordCnt, b[0].size())){ 
                ans.push_back(i - window); 
            } 
            temp += a[i]; 
            if(temp.size() > window) temp.erase(0, 1); 
        } 
        if(temp.size() % window == 0 && ok(temp, wordCnt, b[0].size())) 
            ans.push_back(a.size() - window); 
        return ans; 
    } 
}; 
int main(){ 
    vector<string> v = {"foo", "bar"}; 
    Solution ob; 
    print_vector(ob.findSubstring("barfoothefoobarman", v)); 
}

इनपुट

"barfoothefoobarman" ["foo", "bar"]

आउटपुट

[0, 9, ]
  1. C++ में सभी सबसे गहरे नोड्स वाला सबसे छोटा सबट्री C++ में सभी सबसे गहरे नोड्स वाला सबसे छोटा सबट्री

    मान लीजिए हमारे पास रूट पर रूटेड एक बाइनरी ट्री है, प्रत्येक नोड की गहराई रूट से सबसे छोटी दूरी है। यहां एक नोड सबसे गहरा है यदि इसकी गहराई पूरे ट्री में किसी भी नोड के बीच सबसे बड़ी संभव है। एक नोड का सबट्री वह नोड है, साथ ही उस नोड के सभी वंशजों का सेट। हमें सबसे बड़ी गहराई वाला नोड ढूंढना है जैसे

  1. - C++ में शब्दों को एस्टरिस्क से बदलना

    इस प्रोग्राम का उद्देश्य C++ प्रोग्रामिंग कोड का उपयोग करके किसी स्ट्रिंग में किसी विशेष शब्द को एस्टरिस्क (*) से बदलना है। इस लक्ष्य को प्राप्त करने में वेक्टर और स्ट्रिंग क्लास के आवश्यक फंक्शन महत्वपूर्ण भूमिका निभाते हैं। एल्गोरिदम निम्नलिखित है: एल्गोरिदम शुरुआत चरण-1: स्ट्रिंग इनपुट करें चरण

  1. - C++ में सबस्ट्रिंग को दूसरी सबस्ट्रिंग से रिप्लेस करना

    यहां हम देखेंगे कि सबस्ट्रिंग को दूसरी सबस्ट्रिंग से कैसे रिप्लेस करें। यह स्ट्रिंग के उस हिस्से को रिप्लेस करता है जो कैरेक्टर पोजीशन pos से शुरू होता है और len कैरेक्टर्स तक फैला होता है। रिप्लेस फंक्शन की संरचना नीचे दी गई है: string& replace (size_t pos, size_t len, const string& str, s