ধরুন, আমাদের দুটি স্ট্রিং X এবং Y আছে, এবং আমাদের স্ট্রিং X এর দীর্ঘতম অনুসারীর দৈর্ঘ্য খুঁজে বের করতে হবে, যা Y ক্রম অনুসারে সাবস্ট্রিং। তাই যদি X =“ABCD” এবং Y =“BACDBDCD”, তাহলে আউটপুট হবে 3। যেহেতু "ACD" হল X এর দীর্ঘতম সাব-সিকুয়েন্স, যা Y এর সাবস্ট্রিং।
এখানে আমরা এই সমস্যা সমাধানের জন্য ডায়নামিক প্রোগ্রামিং পদ্ধতি ব্যবহার করব। তাই যদি X-এর দৈর্ঘ্য n হয় এবং Y-এর দৈর্ঘ্য m হয়, তাহলে ডিপি অ্যারে অফ অর্ডার (m+1)x(n+1) তৈরি করুন। DP[i, j]-এর মান হল X[0…j]-এর পরের দৈর্ঘ্যের সর্বাধিক দৈর্ঘ্য, যা Y[0…i]-এর সাবস্ট্রিং। এখন DP এর প্রতিটি ঘরের জন্য, এটি নীচের মত অনুসরণ করবে:
- আমি 1 থেকে m:
- পরিসরে 1 থেকে n
- যখন X[i – 1] Y[j – i] এর মত হয়, তখন DP[i, j] :=1 + DP[i – 1, j – 1]
- অন্যথায় DP[i, j] :=1 + DP[i, j – 1]
- রেঞ্জের মধ্যে j-এর জন্য
এবং অবশেষে x এর দীর্ঘতম অনুসারীর দৈর্ঘ্য, যা y এর সাবস্ট্রিং হল max(DP[i, n]), যেখানে 1 <=i <=m।
উদাহরণ
#include<iostream>
#define MAX 100
using namespace std;
int maxSubLength(string x, string y) {
int table[MAX][MAX];
int n = x.length();
int m = y.length();
for (int i = 0; i <= m; i++)
for (int j = 0; j <= n; j++)
table[i][j] = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (x[j - 1] == y[i - 1])
table[i][j] = 1 + table[i - 1][j - 1];
else
table[i][j] = table[i][j - 1];
}
}
int ans = 0;
for (int i = 1; i <= m; i++)
ans = max(ans, table[i][n]);
return ans;
}
int main() {
string x = "ABCD";
string y = "BACDBDCD";
cout << "Length of Maximum subsequence substring is: " << maxSubLength(x, y);
} আউটপুট
Length of Maximum subsequence substring is: 3