সমস্যা বিবরণ
দুটি লোয়ারকেস স্ট্রিং X এবং Y দেওয়া থাকলে, তাদের দীর্ঘতম সাধারণ সাবস্ট্রিং-এর দৈর্ঘ্য খুঁজে বের করতে হবে।
উদাহরণ: X = "helloworld", Y = "worldbook" হলে আউটপুট হবে 5, কারণ "world" হল দীর্ঘতম সাধারণ সাবস্ট্রিং এবং এর দৈর্ঘ্য 5।
সমাধানের পদ্ধতি
ডাইনামিক প্রোগ্রামিং ব্যবহার করে এই সমস্যাটি সমাধান করা যায়। নিচে ধাপগুলো দেওয়া হলো:
- একটি ২D অ্যারে
longestতৈরি করুন যার আকার (m+1) × (n+1)। এখানে m এবং n হল দুটি স্ট্রিং-এর দৈর্ঘ্য। len = 0ইনিশিয়ালাইজ করুন।- নেস্টেড লুপ চালান: বাহ্যিক লুপ i = 0 থেকে m পর্যন্ত, এবং অভ্যন্তরীণ লুপ j = 0 থেকে n পর্যন্ত।
- যদি i == 0 বা j == 0 হয়, তবে
longest[i][j] = 0। - অন্যथा, যদি
X[i-1] == Y[j-1]হয়, তবে:longest[i][j] = longest[i-1][j-1] + 1- যদি
len < longest[i][j]হয়, তবেlenআপডেট করুন এবং বর্তমান সারি ও কলাম সংরক্ষণ করুন।
- অন্যথায়
longest[i][j] = 0। - শেষে
lenরিটার্ন করুন।
C++ কোড উদাহরণ
#include <iostream>
#include <cstring>
using namespace std;
int solve(char* X, char* Y, int m, int n) {
int longest[m + 1][n + 1];
int len = 0;
int row, col;
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0)
longest[i][j] = 0;
else if (X[i - 1] == Y[j - 1]) {
longest[i][j] = longest[i - 1][j - 1] + 1;
if (len < longest[i][j]) {
len = longest[i][j];
row = i;
col = j;
}
} else
longest[i][j] = 0;
}
}
return len;
}
int main() {
char X[] = "helloworld";
char Y[] = "worldbook";
int m = strlen(X);
int n = strlen(Y);
cout << solve(X, Y, m, n);
return 0;
}
ইনপুট ও আউটপুট
ইনপুট: "helloworld", "worldbook"
আউটপুট: 5
সময় ও জটিলতা
- সময় জটিলতা: O(m × n)
- স্থান জটিলতা: O(m × n)