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

C++ में न्यूनतम विंडो सबस्ट्रिंग


मान लीजिए हमारे पास एक स्ट्रिंग S और T है। हमें S में न्यूनतम विंडो ढूंढनी है जिसमें T के सभी कैरेक्टर्स हों। यदि इनपुट "ABHDAXCVBAGTXATYCB" और T = "ABC" है, तो परिणाम "CVBA" होगा।

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

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

  • एक मैप m बनाएं
  • x की आवृत्ति को m में स्टोर करें
  • length := s का आकार, left := 0, right := 0, ansLeft := 0, ansRight := 0
  • counter := x का आकार, flag := false, ans := खाली स्ट्रिंग
  • जब तक right < s का आकार:
    • c := s[right]
    • यदि c, m में मौजूद है:
      • यदि m[c] > 0, तो counter को 1 घटाएं
      • m[c] को 1 घटाएं
    • जब तक counter == 0 और left <= right:
      • यदि right - left + 1 <= length:
        • length := right - left + 1
        • flag := true
        • ansLeft := left, ansRight := right
      • यदि left == right, तो लूप तोड़ें
      • c := s[left]
      • यदि c, m में मौजूद है, तो m[c] को 1 बढ़ाएं
      • यदि m[c] > 0, तो counter को 1 बढ़ाएं
      • left को 1 बढ़ाएं
    • right को 1 बढ़ाएं
  • यदि flag false है, तो ans वापस करें
  • अन्यथा ansLeft से ansRight तक के कैरेक्टर्स को ans में जोड़ें
  • ans वापस करें

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

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

#include <bits/stdc++.h> 
using namespace std; 
class Solution { 
public: 
    string minWindow(string s, string x) { 
        map<char, int> m; 
        for(int i = 0; i < x.size(); i++) m[x[i]]++; 
        int length = s.size(); 
        int left = 0, right = 0, ansLeft = 0, ansRight = 0; 
        int counter = x.size(); 
        bool flag = false; 
        string ans = ""; 
        while(right < s.size()){ 
            char c = s[right]; 
            if(m.find(c) != m.end()){ 
                if(m[c] > 0) counter--; 
                m[c]--; 
            } 
            while(counter == 0 && left <= right){ 
                if(right - left + 1 <= length){ 
                    length = right - left + 1; 
                    flag = true; 
                    ansLeft = left; 
                    ansRight = right; 
                } 
                if(left == right) break; 
                c = s[left]; 
                if(m.find(c) != m.end()){ 
                    m[c]++; 
                    if(m[c] > 0) counter++; 
                } 
                left++; 
            } 
            right++; 
        } 
        if(!flag) return ans; 
        else 
            for(int i = ansLeft; i <= ansRight; i++) ans += s[i]; 
        return ans; 
    } 
}; 
int main(){ 
    Solution ob; 
    cout << (ob.minWindow("ABHDAXCVBAGTXATYCB", "ABC")); 
}

इनपुट

"ABHDAXCVBAGTXATYCB" "ABC"

आउटपुट

CVBA
  1. C++ में न्यूनतम नाइट मूव्स C++ में न्यूनतम नाइट मूव्स

    मान लीजिए हमारे पास एक अनंत शतरंज बोर्ड है जिसके कोऑर्डिनेट्स -इनफिनिटी से +इनफिनिटी तक हैं, और हमारे पास [0, 0] स्क्वायर पर एक नाइट है। नाइट के 8 संभावित मूव्स होते हैं, जैसा कि नीचे दिखाया गया है। प्रत्येक मूव कार्डिनल डायरेक्शन में दो स्क्वायर, फिर ऑर्थोगोनल डायरेक्शन में एक स्क्वायर होता है। ह

  1. - C++ में सबस्ट्रिंग

    सबस्ट्रिंग एक स्ट्रिंग का हिस्सा है। C++ में सबस्ट्रिंग प्राप्त करने के लिए एक फ़ंक्शन substr() है। इस फ़ंक्शन में दो पैरामीटर्स होते हैं: pos और len। pos पैरामीटर सबस्ट्रिंग की शुरुआती पोजीशन निर्दिष्ट करता है और len सबस्ट्रिंग में कैरेक्टर्स की संख्या दर्शाता है। उदाहरण #include <iostream>

  1. - विंडोज पर C++ के लिए शीर्ष IDE

    बड़े प्रोजेक्ट्स को केवल टेक्स्ट एडिटर्स पर प्रबंधित करना मुश्किल होता है। ऐसे मामलों में IDE का उपयोग करने से आप अधिक उत्पादक और कम निराश होंगे। विभिन्न प्रकार के IDE उपलब्ध हैं और आपको अपनी आवश्यकताओं के अनुरूप सही चुनना चाहिए। यहां विंडोज के लिए सर्वश्रेष्ठ C/C++ IDEs की सूची दी गई है। Visual S