Following is a DP solution of this problem.

/**//*
Name: LCS.H
Copyright: All Right Reserved 2008 Li Zu-ding
Author: li zu-ding<lizuding@gmail.com>
Date: 29-02-08 08:47
Description: this code is the answer of longest common subsquence(LCS) problem
*/
#include <iostream>
#include <assert.h>
using namespace std;

enum Direct ...{ kNull = 0, kUpperRight, kUpper, kRight };
template <typename T, int size1, int size2>
void length_of_lcs(T (&str1)[size1], T (&str2)[size2],
int (&length)[size1][size2],
Direct (&direct)[size1][size2]) ...{
int i, j;
for (i = 0; i < size1; ++i)
length[i][0] = kNull;
for (j = 0; j < size2; ++j)
length[0][j] = kNull;
for (i = 1; i < size1; ++i)
for (j = 1; j != size2; ++j) ...{
if (str1[i] == str2[j] ) ...{
length[i][j] = length[i-1][j-1] + 1;
direct[i][j] = kUpperRight;
} else ...{ 
if (length[i-1][j] > length[i][j-1]) ...{
length[i][j] = length[i-1][j];
direct[i][j] = kRight;
} else ...{
length[i][j] = length[i][j-1];
direct[i][j] = kUpper;
}
}
}
}
template <typename T, typename Functor, int size1, int size2>
void construct_lcs(Direct (&direct)[size1][size2],
T (&r_str)[size1],
int i, int j, Functor functor) ...{
if ((0 == i) or (0 == j))
return;
if (kUpperRight == direct[i][j]) ...{
functor(r_str[i]);
construct_lcs(direct, r_str, i-1, j-1, functor);
} else
if (kUpper == direct[i][j])
construct_lcs(direct, r_str, i, j-1, functor);
else
if (kRight == direct[i][j])
construct_lcs(direct, r_str, i-1, j, functor);
}
struct print
...{
void operator()(char c) ...{ cout << c << " "; }
};
本文介绍了一种使用动态规划解决最长公共子序列(LCS)问题的方法,并提供了详细的算法实现步骤。通过构建矩阵来记录两个字符串之间的匹配情况,进而找出最长的公共子序列。
1万+

被折叠的 条评论
为什么被折叠?



