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

C++-এ Partition Labels

এই সমস্যায় একটি স্ট্রিং দেওয়া থাকলে, সেটিকে যতটা সম্ভব বেশি পার্টিশনে ভাগ করতে হবে যাতে প্রতিটি লেটার শুধু একটি পার্টিশনে থাকে। প্রতিটি পার্টিশনের সাইজ বের করে একটি লিস্ট রিটার্ন করতে হবে।

উদাহরণস্বরূপ, স্ট্রিং "ababcbacadefegdehijhklij" এর আউটপুট হবে [9, 7, 8], কারণ পার্টিশনগুলো হবে "ababcbaca", "defegde", "hijhklij"।

সমাধানের পদ্ধতি

  • একটি ম‍‍্যাপ cnt তৈরি করুন যাতে প্রতিটি ক্যারেক্টারের লাস্ট অকারেন্স (last occurrence) স্টোর করা যায়।
  • স্ট্রিং ট্রাভার্স করুন: j = max(j, cnt[s[i]])।
  • যদি i == j হয়, তবে একটি পার্টিশন শেষ হয়েছে। সাইজ i - start + 1 অ‍‍্যারে যোগ করুন এবং start = i + 1 আপডেট করুন।

উদাহরণ (C++)

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

void print_vector(vector<int> v) {
    cout << "[";
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << (i + 1 == v.size() ? "" : ", ");
    }
    cout << "]" << endl;
}

class Solution {
public:
    vector<int> partitionLabels(string s) {
        unordered_map<char, int> cnt;
        for (int i = 0; i < s.size(); i++) cnt[s[i]] = i;
        int j = 0, start = 0;
        vector<int> ans;
        for (int i = 0; i < s.size(); i++) {
            j = max(j, cnt[s[i]]);
            if (i == j) {
                ans.push_back(i - start + 1);
                start = i + 1;
            }
        }
        return ans;
    }
};

int main() {
    Solution ob;
    print_vector(ob.partitionLabels("ababcbacadefegdehijhklij"));
    return 0;
}

ইনপুট

"ababcbacadefegdehijhklij"

আউটপুট

[9, 7, 8]
  1. C++ দিয়ে একটি সংখ্যাকে দুই ভাগে ভাগ করা যাতে উভয় ভাগ বিভাজ্য হয়

  2. C++-এ static_assert এর ব্যবহার

  3. C++-এ অ্যারেতে পার্টিশন পয়েন্ট বের করা

  4. বাইনারি ট্রি সমান পার্টিশান করা C++-এ