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

C++ में स्ट्रिंग में सभी स्थितियों तक सिग्नल पहुंचने का समय ढूंढना


परिचय

इस ट्यूटोरियल में हम एक ऐसा प्रोग्राम लिखेंगे जो स्ट्रिंग में सभी स्थितियों तक सिग्नल पहुंचने में लगने वाले समय की गणना करता है। आइए एक उदाहरण से समझते हैं।

हमारे पास एक स्ट्रिंग होगी जिसमें केवल s और p कैरेक्टर होंगे। s एक सिग्नल है और p स्ट्रिंग में एक स्थिति (position) है। एक सिग्नल s से शुरू होता है और बाएं और दाएं दोनों दिशाओं में यात्रा करता है। हम मान रहे हैं कि स्ट्रिंग में अगली स्थिति तक यात्रा करने में एक इकाई समय लगता है। हमारा कार्य सभी स्थितियों को सिग्नल में बदलने के लिए आवश्यक समय की गणना करना है।

उदाहरण

इनपुट - pppppspss

आउटपुट - 5

इनपुट - pspspsps

आउटपुट - 1

इनपुट - ssssss

आउटपुट - 0

समस्या समाधान के चरण

  1. एक स्ट्रिंग और समय (0) इनिशियलाइज़ करें।
  2. स्ट्रिंग पर पुनरावृत्ति करें।
    • लगातार p कैरेक्टर्स गिनें और काउंट को एक वेरिएबल में स्टोर करें।
    • यदि वर्तमान कैरेक्टर s है और p काउंट पिछले समय से अधिक है तो जांचें कि बाईं ओर s मौजूद है या नहीं।
    • यदि s दोनों तरफ मौजूद है, तो काउंट को दो हिस्सों में बांटें क्योंकि s दोनों दिशाओं में यात्रा कर सकता है।
    • p की गिनती रीसेट करें।

उदाहरण कोड

#include <bits/stdc++.h>
using namespace std;

int timeToConvertToSignalString(string sample_string, int string_len) {
    int p_count = 0, time = 0;
    for (int i = 0; i <= string_len; i++) {
        if (sample_string[i] == 'p') {
            p_count++;
        } else {
            if (p_count > time) {
                bool is_present_left_side = false;
                if (((i - p_count) > 0) && (sample_string[i - p_count - 1] == 's')) {
                    is_present_left_side = 1;
                }
                if (is_present_left_side) {
                    p_count = ceil((double)p_count / 2);
                }
                time = max(time, p_count);
            }
            p_count = 0;
        }
    }
    return time;
}

int main() {
    string sample_string = "pppppspss";
    int n = sample_string.size();
    cout << timeToConvertToSignalString(sample_string, n) << endl;
    return 0;
}

आउटपुट

5

व्याख्या

"pppppspss" के लिए: पहले 5 p's, फिर s, फिर p, फिर ss। पहले 5 p's को कवर करने के लिए बाएं s को 5 यूनिट समय लगता है (कोई बायां s नहीं)। मध्य p के दोनों तरफ s हैं, इसलिए 1/2 = 0.5 → 1 यूनिट। अधिकतम = 5।

निष्कर्ष

यह एल्गोरिदम सिग्नल प्रोपेगेशन का अनुकरण करता है। विभिन्न टेस्ट केस के साथ प्रोग्राम चलाकर जांचें। यदि आपके कोई प्रश्न हैं, तो कमेंट सेक्शन में पूछें।


  1. - C++ प्रोग्राम: दी गई स्ट्रिंग में "1(0+)1" के सभी पैटर्न ज्ञात करना

    मान लें किसी स्ट्रिंग में 1(0+)1 जैसे पैटर्न हैं। जहां (0+) 1 की गैर-खाली लगातार घटनाओं को इंगित करता है। हमें सभी पैटर्न ज्ञात करने हैं। पैटर्न ओवरलैप हो सकते हैं। स्ट्रिंग आवश्यक रूप से बाइनरी स्ट्रिंग नहीं है। यह केवल अंक और लोअरकेस वर्ण रख सकती है। मान लें स्ट्रिंग 1101001 की तरह है, तो ऐसे दो प

  1. - C++ प्रोग्राम: शब्दकोश में विशिष्ट पैटर्न से मेल खाने वाली सभी स्ट्रिंग्स ज्ञात करना

    मान लें हमारे पास स्ट्रिंग्स की एक सूची है जिसे शब्दकोश कहा जाता है। हमारे पास एक अन्य पैटर्न स्ट्रिंग है। हमारा कार्य उन स्ट्रिंग्स को ज्ञात करना है जो पैटर्न से मेल खाती हैं। मान लें शब्दकोश [abb, xyz, aab, kmm] की तरह है, और पैटर्न stt है, तो परिणाम abb और kmm होंगे। चूंकि पैटर्न में पहले एक अक्ष

  1. - C++ प्रोग्राम: सीक्वेंस के सेट में सभी सीक्वेंस के लिए कॉमन सबसे लंबी सबसीक्वेंस खोजना

    यहां हम एक C++ प्रोग्राम पर चर्चा करेंगे जो एक सेट ऑफ सीक्वेंस में सभी सीक्वेंस के लिए कॉमन सबसे लंबी सबसीक्वेंस खोजता है। एल्गोरिदम Begin स्ट्रिंग्स की ऐरे को इनपुट के रूप में लें। function matchedPrefixtill(): स्ट्रिंग s1 और s2 के बीच मैच्ड प्रीफिक्स खोजें: n1 = स्ट्रिंग s1 की लं