LCS算法,特别要求举例时采用不同于讲义的数据进行推导。
解析
设计
一:给出算法的最长子序列的长度
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (x[i] == y[j]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else {
if (dp[i - 1][j] > dp[i][j - 1]) {
b[i][j] = 1;
dp[i][j] = dp[i - 1][j];
}
else {
b[i][j] = 2;
dp[i][j] = dp[i][j - 1];
}
}
}
}
二:求最长公共子序列
int i = n, j = m;
while (i != 0 && j != 0) {
if (b[i][j] == 0) {
lcs[dp[i][j]] = x[i];
i--, j--;
}
else if (b[i][j] == 1) {
i--;
}
else {
j--;
}
}
分析
时间复杂度:O(mn)
源码
https://github.com/pt0918/-/blob/master/LCS.cpp