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

C++-এ সাবস্ট্রিং রিপ্লেস করে ব্যালেন্সড স্ট্রিং বানানো


শুধু 'Q', 'W', 'E', 'R' — এই চারটি ক্যারেক্টার ধারণকারী একটি স্ট্রিং দেওয়া আছে। একটি স্ট্রিং ব্যালেন্সড হবে যদি প্রতিটি ক্যারেক্টার ঠিক n/4 বার আসে, যেখানে n হলো স্ট্রিংয়ের দৈর্ঘ্য। এমন ন্যূনতম দৈর্ঘ্যের সাবস্ট্রিং খুঁজে বের করতে হবে যেটিকে যেকোনো অন্য সমান দৈর্ঘ্যের স্ট্রিং দিয়ে রিপ্লেস করলে মূল স্ট্রিংটি ব্যালেন্সড হয়ে যাবে। উদাহরণস্বরূপ, s = "QQWE" হলে আউটপুট ১, কারণ Q-কে R দিয়ে রিপ্লেস করলে "RQWE" ব্যালেন্সড হয়। স্ট্রিং ইতিমধ্যে ব্যালেন্সড থাকলে ০ ফেরত দিন।

সমাধানের ধাপগুলো:

  • m নামের একটি ম্যাপ বানান।
  • স্ট্রিংয়ের প্রতিটি ক্যারেক্টারের ফ্রিকোয়েন্সি m-এ স্টোর করুন, n := s.size()।
  • res := n, left := 0
  • right = 0 থেকে n-1 পর্যন্ত:
    • m[s[right]] ১ কমান।
    • left < n এবং m['Q'] <= n/4 এবং m['W'] <= n/4 এবং m['E'] <= n/4 এবং m['R'] <= n/4 रहने পর্যন্ত:
      • res := min(res, right - left + 1)
      • m[s[left]] ১ বাড়ান।
      • left ১ বাড়ান।
  • res ফেরত দিন।

নিচের ইমপ্লিমেন্টেশনটি দেখুন:

উদাহরণ

#include <bits/stdc++.h> using namespace std; class Solution {    public:    int balancedString(string s) {       unordered_map <char, int> m;       for(int i = 0;i<s.size();i++)m[s[i]]++;       int n = s.size();       int res = n;       int left = 0;       for(int right = 0;right<n;right++){          m[s[right]]--;          while(left<n && m['Q']<=n/4 && m['W'] <=n/4 && m['E'] <=n/4 && m['R']<=n/4){             res = min(res, right - left + 1);             m[s[left]]+=1;             left++;          }       }       return res;    } }; main(){    Solution ob;    cout << (ob.balancedString("QQEQ")); }

ইনপুট

"QQEQ"

আউটপুট

2

  1. স্ট্রিং-এ প্রথম রিপিটেড ওয়ার্ড বের করা (C++)

  2. অ্যারেতে প্রিফিক্সের ম্যাক্সিমাম অকারেন্স বের করা C++-এ

  3. C++ দিয়ে একটি স্ট্রিংয়ের সাবস্ট্রিং-এর সংখ্যা বের করা

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