কম্পিউটার টিউটোরিয়াল

C++-এ মিনিমাম উইন্ডো সাবস্ট্রিং (Minimum Window Substring)


ধরুন আমাদের কাছে একটি স্ট্রিং S এবং T আছে। আমাদের কাজ হল S-এ সেই ন্যূনতম উইন্ডো (উপস্ট্রিং) খুঁজে বের করা যাতে T-এর সকল অক্ষর থাকে। যেমন, S = "ABHDAXCVBAGTXATYCB" এবং T = "ABC" হলে ফলাফল হবে "CVBA"।

সমাধানের ধাপসমূহ:

  • একটি ম্যাপ m তৈরি করুন।

  • T-এর অক্ষরগুলোর ফ্রিকোয়েন্সি m-এ সংরক্ষণ করুন।

  • length := S-এর আকার, left := 0, right := 0, ansLeft := 0, ansRight := 0

  • counter := T-এর আকার, flag := false, ans := খালি স্ট্রিং

  • যখন right < S.size() হয়:

    • c := S[right]

    • যদি c m-এ থাকে: যদি m[c] > 0 হয় তবে counter--; m[c]--

    • যখন counter == 0 এবং left <= right:

      • যদি right - left + 1 <= length: length আপডেট করুন, flag = true, ansLeft = left, ansRight = right

      • যদি left == right হয় তবে ব্রেক করুন

      • c := S[left], যদি c m-এ থাকে তবে m[c]++, যদি m[c] > 0 হয় তবে counter++

      • left++

    • right++

  • যদি flag false হয় তবে ans রিটার্ন করুন, অন্যথায় ansLeft থেকে ansRight পর্যন্ত অক্ষরগুলো ans-এ যোগ করুন এবং রিটার্ন করুন।

উদাহরণ

#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")); 
    return 0;
}

ইনপুট

"ABHDAXCVBAGTXATYCB" "ABC"

আউটপুট

CVBA
  1. C++-এ নাইটের ন্যূনতম মুভ গণনা করুন

  2. C++-এ বাইনারি স্ট্রিং-এ ১ বামে এবং ০ ডানে আনতে মিনিমাম ফ্লিপ

  3. C++-এ সাবস্ট্রিং

  4. উইন্ডোজে C++-এর জন্য সেরা IDE কী? (আলাদা লেখা)