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

পাইথনে স্ট্রিং S-এর সকল অ্যানাগ্রামের স্টার্ট ইন্ডেক্স T-এ খুঁজে বের করার প্রোগ্রাম


ধরুন আমাদের দুটি স্ট্রিং S এবং T আছে, আমাদের T-এ S-এর সকল অ্যানাগ্রামের স্টার্ট ইন্ডেক্স খুঁজে বের করতে হবে। স্ট্রিংগুলো শুধু ছোট হাতের অক্ষর ধারণ করে এবং S এবং T-এর দৈর্ঘ্য যথাক্রমে ২০ এবং ১০০ এর চেয়ে বড় হবে না।

ইনপুট: S = "cab", T = "bcabxabc" → আউটপুট: [0, 1, 5] কারণ সাবস্ট্রিং "bca", "cab", "abc"।

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

  • একটি ম্যাপ m, n := S-এর সাইজ, left := 0, right := 0, counter := P-এর সাইজ
  • এনসার অ্যারে ans ডিফাইন করুন
  • P-র ক্যারেক্টার ফ্রিকোয়েন্সি ম্যাপ m-এ স্টোর করুন
  • right = 0 থেকে n-1 পর্যন্ত লুপ করুন
    • যদি m-এ s[right] থাকে এবং m[s[right]] নন-জিরো হয়, তবে m[s[right]] ১ কমান, counter ১ কমান, যদি counter = 0 হয় তবে left কে ans-এ যোগ করুন
    • অন্যথায়, left < right পর্যন্ত লুপ করুন
      • যদি s[left] m-এ না থাকে, তবে counter বাড়ান, m[s[left]] বাড়ান
      • left বাড়ান
      • যদি m-এ s[right] থাকে এবং নন-জিরো হয়, তবে right ১ কমান করে লুপ থেকে বের হোন
    • যদি m-এ s[left] না থাকে, তবে left := right + 1 সেট করুন
  • ans ফেরত দিন

বাস্তবায়ন (C++)

#include 
using namespace std;
void print_vector(vector v){
    cout << "[";
    for(int i = 0; i findAnagrams(string s, string p) {
        map  m;
        int n = s.size();
        int left = 0, right = 0;
        int counter = p.size();
        vector  ans;
        for(int i = 0; i < p.size(); i++) m[p[i]]++;
        for(int right = 0; right < n; right++){
            if(m.find(s[right]) != m.end() && m[s[right]]){
                m[s[right]]--;
                counter--;
                if(counter == 0)ans.push_back(left);
            } else {
                while(left

ইনপুট

"bcabxabc", "cab"

আউটপুট

[0, 1, 5, ]
  1. পাইথনে দেওয়া ইনডেক্স অনুযায়ী স্ট্রিং শাফল করার প্রোগ্রাম

  2. দেওয়া স্ট্রিংয়ের সকল পারমিউটেশন প্রিন্ট করার পাইথন প্রোগ্রাম

  3. পাইথনে স্ট্রিং-এ ডুপ্লিকেট ক্যারেক্টার খুঁজে বের করার প্রোগ্রাম

  4. পাইথন প্রোগ্রাম: স্ট্রিং-এ মিরর ক্যারেক্টার বের করা