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

C++-এ দুটি স্ট্রিং-এ কমন সাবসিকোয়েন্স (Common Subsequence) গণনা


আমাদের দুটি স্ট্রিং str1 এবং str2 দেওয়া আছে। কাজ হল দুটি স্ট্রিং-এ কমন সাবসিকোয়েন্স (Common Subsequence) - অর্থাৎ যেসব সিকোয়েন্স দুটি স্ট্রিং-এই কানোনিক্যাল অর্ডারে পাওয়া যায় - তাদের মোট সংখ্যা গণনা করা। এখানে ডাইনামিক প্রোগ্রামিং (Dynamic Programming) ব্যবহার করা হয়েছে।

ডাইনামিক প্রোগ্রামিং সমস্যাকে ছোট ছোট সাব-প্রობলেমে ভাগ করে সমাধান করে এবং ওভারল্যাপিং সাব-প্রোবলেমের ফলাফল মেমোরাইজ (memoize) করে রি-ইউজ করে। এটি অপ্টিমাইজেশন সমস্যায় ব্যবহৃত হয়।

উদাহরণ:

ইনপুট: str1 = "abc", str2 = "ab" → আউটপুট: count is 3 ({'a', 'b', 'ab'})

ইনপুট: str1 = "ajblqcpdz", str2 = "aefcnbtdi" → আউটপুট: count is 11

অ্যালগরিদম

  • দুটি স্ট্রিং ইনপুট নিন, দৈর্ঘ্য len1, len2 বের করুন

  • 2D DP অ্যারে dp[len1+1][len2+1] তৈরি করুন, ০ দিয়ে ইনিশিয়ালাইজ করুন

  • i = 1 থেকে len1, j = 1 থেকে len2 পর্যন্ত লুপ:

    • যদি str1[i-1] == str2[j-1]: dp[i][j] = 1 + dp[i][j-1] + dp[i-1][j]

    • অন্যথায়: dp[i][j] = dp[i][j-1] + dp[i-1][j] - dp[i-1][j-1]

  • dp[len1][len2] রিটার্ন করুন

প্রোগ্রাম

#include <iostream> 
using namespace std; 

int countsequences(string str, string str2) { 
    int n1 = str.length(); 
    int n2 = str2.length(); 
    int dp[n1+1][n2+1]; 
    for (int i = 0; i <= n1; i++) 
        for (int j = 0; j <= n2; j++) 
            dp[i][j] = 0; 
    for (int i = 1; i <= n1; i++) { 
        for (int j = 1; j <= n2; j++) { 
            if (str[i - 1] == str2[j - 1]) 
                dp[i][j] = 1 + dp[i][j - 1] + dp[i - 1][j]; 
            else 
                dp[i][j] = dp[i][j - 1] + dp[i - 1][j] - dp[i - 1][j - 1]; 
        } 
    } 
    return dp[n1][n2]; 
} 

int main() { 
    string str = "abcdejkil"; 
    string str2 = "bcdfkaoenlp"; 
    cout << "count is: " << countsequences(str, str2) << endl; 
    return 0; 
}

আউটপুট

count is: 51
  1. সি++-এ দুটি বাইনারি স্ট্রিং যোগ করার প্রোগ্রাম

  2. C++-এ স্ট্রিং অ্যারে: string কীওয়ার্ড ব্যবহার

  3. C++-এ কেস-ইনসেনসিটিভ স্ট্রিং কম্পারিজন

  4. দুই স্ট্রিং কনক্যাটেনেট (Concatenate) করার C++ প্রোগ্রাম