- 最长公共子序列(LCS)定义:
给定序列s1={1,3,4,5,6,7,7,8}, s2={3,5,7,4,8,6,7,8,2},s1和s2的相同子序列,且该子序列的长度最长,即是LCS。
公共子序列就是,s1和s2中都要包含的元素,并且顺序是保持不变的;其中上述s1和s2一个最长公共子序列是{ 3,4,6,7,8 };
- 递推关系:
二维数组arr[i][j]的元素存放,子串s中,s0s1s2s3……si-1,和子t中,t0t1t2t3……..ti-1这两个子串的LCS长度;
1)当si=tj时——arr[i][j]=arr[i-1]+arr[j-1]+1;
2)当 si≠tj时——arr[i][j]=max(arr[i-1][j],arr[i][j-1]);
- 代码实现
#include<iostream>
using namespace std;
#include<algorithm>
#include<string>
#include<vector>
int lcs(string s, string t) {
int slen = s.size();
int tlen = s.size();
int i = 0, j = 0;
//创建二维数组
vector<int> col(slen + 1, 0);
vector<vector<int>>arr(tlen + 1, col);
for (int i = 1; i <=slen; i++) { //逐行从左往右填写表
for (int j = 1; j <=tlen; j++) {
if (s[i-1] == t[j-1]) {
arr[i][j] = arr[i - 1][j - 1] + 1;
}
else
{
arr[i][j] = (arr[i - 1][j]) > (arr[i][j - 1]) ? arr[i - 1][j] : arr[i][j - 1];
}
}
}
return arr[slen][tlen];
}
int main() {
string s = "13456778";
string t = "357486782";
int len = lcs(s, t);
cout << "最长公共子序列长度为:" << len << endl; //输出为5
return 0;
system("pause");
return 0;
}