मान लीजिए, हमारे पास दो स्ट्रिंग्स X और Y हैं, और हमें स्ट्रिंग X के सबसे लंबे बाद के अनुक्रम की लंबाई का पता लगाना है, जो अनुक्रम Y में है। इसलिए यदि X ="ABCD" और Y ="BACDBDCD", तो आउटपुट 3 होगा। . चूंकि "एसीडी" एक्स का सबसे लंबा उप-अनुक्रम है, जो वाई का विकल्प है।
यहां हम इस समस्या को हल करने के लिए गतिशील प्रोग्रामिंग दृष्टिकोण का उपयोग करेंगे। इसलिए यदि X की लंबाई n है, और Y की लंबाई m है, तो क्रम की DP सरणी बनाएं (m+1)x(n+1)। DP का मान [i, j], X[0…j] के बाद की अधिकतम लंबाई है, जो Y[0…i] का विकल्प है। अब DP के प्रत्येक सेल के लिए, यह नीचे की तरह अनुसरण करेगा:
- i के लिए 1 से m की सीमा में:
- जे के लिए 1 से n की सीमा में
- जब X[i – 1] Y[j – i] के समान हो, तब DP[i, j] :=1 + DP[i – 1, j – 1]
- अन्यथा डीपी[i, j] :=1 + DP[i, j-1]
- जे के लिए 1 से n की सीमा में
और अंत में x के सबसे लंबे अनुवर्ती की लंबाई, जो कि y का विकल्प है, अधिकतम (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