কম্পিউটার

C++ প্রোগ্রামিং-এ স্বতন্ত্র অনুসৃতি


ধরুন আমাদের S এবং T স্ট্রিং আছে। আমাদেরকে S-এর স্বতন্ত্র ক্রম সংখ্যা গণনা করতে হবে যা T-এর সমান।

আমরা জানি যে একটি স্ট্রিংয়ের পরবর্তী স্ট্রিং হল একটি নতুন স্ট্রিং যা অবশিষ্ট অক্ষরের আপেক্ষিক অবস্থানগুলিকে বিরক্ত না করে কিছু অক্ষর (কোনটিও হতে পারে না) সরিয়ে দিয়ে মূল স্ট্রিং থেকে গঠিত হয়। (যেমন, "ACE" হল "ABCDE" এর একটি অনুবর্তন যেখানে "AEC" নয়)।

যদি ইনপুট স্ট্রিংগুলি হয় "balllloonnn" এবং "বেলুন", তাহলে নির্বাচন করার 36টি ভিন্ন উপায় থাকবে৷

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • n :=s এর আকার, m :=t এর আকার। তাদের আগে ফাঁকা স্থান সংযুক্ত করে s এবং t আপডেট করুন

  • আকারের একটি ম্যাট্রিক্স তৈরি করুন (n + 1) x (m + 1)

  • dp[0, 0] :=1 সেট করুন, তারপর সমস্ত সারির 0 তম কলামের জন্য 1 সেট করুন, 1 রাখুন

  • আমি 1 থেকে n

    রেঞ্জের মধ্যে
    • 1 থেকে m

      পরিসরে j এর জন্য
      • যদি s[i] =t[j], তাহলে

        • dp[i, j] :=dp[i – 1, j – 1]

      • dp[i, j] :=dp[i, j] + dp[i – 1, j]

  • dp[n, m]

    ফেরত দিন

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   int numDistinct(string s, string t) {
      int n = s.size();
      int m = t.size();
      s = " " + s;
      t = " " + t;
      vector < vector <lli> > dp(n + 1, vector <lli> (m + 1));
      dp[0][0] = 1;
      for(int i = 1; i <= n; i++)dp[i][0] = 1;
      for(int i = 1; i <= n; i++){
         for(int j = 1; j <= m; j++){
            if(s[i] == t[j]) dp[i][j] = dp[i - 1][j - 1];
            dp[i][j]+= dp[i - 1][j];
         }
      }
      return dp[n][m];
   }
};
main(){
   Solution ob;
   cout << (ob.numDistinct("baalllloonnn", "balloon"));
}

ইনপুট

"baalllloonnn"
"balloon"

আউটপুট

36

  1. C++ এ বেসিক গ্রাফিক প্রোগ্রামিং

  2. C++ প্রোগ্রামিং ভাষার মূল বিষয়?

  3. সি++ প্রোগ্রামিং ভাষার বৈশিষ্ট্য

  4. C++ প্রোগ্রামিং ভাষা কি?