假设我们有两个字符串X和Y,我们必须找到字符串X的最长子序列的长度,它是序列Y中的子字符串。因此,如果X =“ ABCD”和Y =“ BACDBDCD”,则输出将为3因为“ ACD”是X的最长子序列,它是Y的子串。
在这里,我们将使用动态编程方法来解决此问题。因此,如果X的长度为n,Y的长度为m,则创建顺序为(m + 1)x(n + 1)的DP数组。DP [i,j]的值是X [0…j]的子序列的最大长度,它是Y [0…i]的子串。现在,对于DP的每个单元,如下所示:
对于1到m范围内的i:
当X [i – 1]与Y [j – i]相同时,则DP [i,j]:= 1 + DP [i – 1,j – 1]
否则DP [i,j]:= 1 + DP [i,j – 1]
对于1到n范围内的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