最长公共子序列算法C++实现代码:
string LCS(string s1,string s2) {
if (s1 == "" || s2 == "") {
return "";
}
int m = s1.length()+1;
int n = s2.length()+1;
//动态二维数组的定义方法
int** LCS = new int*[m];
for (int i = 0; i < m; i++) {
LCS[i] = new int[n];
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
LCS[i][j] = 0;
}
}
//生成LCS数组
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (s1[i - 1] == s2[j - 1]) {
LCS[i][j] = LCS[i - 1][j - 1] + 1;
}
else {
int k = LCS[i - 1][j];
int l = LCS[i][j - 1];
LCS[i][j] = k > l ? k : l;
}
}
}
//取出最长子序列(注意取值范围加一会多出一个/0)
int i = m - 1;
int j = n - 1;
string ss = "";
while (i != 0 && j != 0) {
if (s1[i-1] == s2[j-1]) {
ss += s1[i-1];
i--;
j--;
}
else {
if (LCS[i][j-1] > LCS[i-1][j]) {
j--;
}
else {
i--;
}
}
}
//倒置
reverse(ss.begin(),ss.end());
return ss;
}
最长公共子串求法C++实现代码:
string RES(string s1,string s2) {
if (s1 == "" || s2 == "") {
return "";
}
int m = s1.length() + 1;
int n = s2.length() + 1;
//动态二维数组的定义方法
int** Res = new int*[m];
for (int i = 0; i < m; i++) {
Res[i] = new int[n];
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
Res[i][j] = 0;
}
}
//生成Res数组
int row = 0, col = 0, max = 0;
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (s1[i - 1] == s2[j - 1]) {
Res[i][j] = Res[i - 1][j - 1] + 1;
if (Res[i][j] > max) {
//保存最大值位置
max = Res[i][j];
row = i;
col = j;
}
}
else {
Res[i][j] = 0;
}
}
}
//取出最长子串
int i = row;
int j = col;
string ss = s1.substr(row - max, max);
return ss;
}