您的位置:首页 > 编程语言 > C语言/C++

C++实现最长公共子序列和最长公共子串

2016-07-14 21:36 706 查看
转载自:点击打开链接





// LCS.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>

using namespace::std;

int lcs(string str1, string str2, vector<vector<int>>& vec) {
int len1 = str1.size();
int len2 = str2.size();
vector<vector<int>> c(len1 + 1, vector<int>(len2 + 1, 0));
for (int i = 0; i <= len1; i++) {
for (int j = 0; j <= len2; j++) {
if (i == 0 || j == 0) {
c[i][j] = 0;
}
else if (str1[i - 1] == str2[j - 1]) {
c[i][j] = c[i - 1][j - 1] + 1;
vec[i][j] = 0;
}
else if (c[i - 1][j] >= c[i][j - 1]){
c[i][j] = c[i - 1][j];
vec[i][j] = 1;
}
else{
c[i][j] = c[i][j - 1];
vec[i][j] = 2;
}
}
}

return c[len1][len2];
}

void print_lcs(vector<vector<int>>& vec, string str, int i, int j)
{
if (i == 0 || j == 0)
{
return;
}
if (vec[i][j] == 0)
{
print_lcs(vec, str, i - 1, j - 1);
printf("%c", str[i - 1]);
}
else if (vec[i][j] == 1)
{
print_lcs(vec, str, i - 1, j);
}
else
{
print_lcs(vec, str, i, j - 1);
}
}

int _tmain(int argc, _TCHAR* argv[])
{
string str1 = "123456";
string str2 = "2456";
vector<vector<int>> vec(str1.size() + 1, vector<int>(str2.size() + 1, -1));
int result = lcs(str1, str2, vec);

cout << "result = " << result << endl;

print_lcs(vec, str1, str1.size(), str2.size());

getchar();
return 0;
}




int lcs_2(string str1, string str2, vector<vector<int>>& vec) {
int len1 = str1.size();
int len2 = str2.size();
int result = 0; //记录最长公共子串长度
vector<vector<int>> c(len1 + 1, vector<int>(len2 + 1, 0));
for (int i = 0; i <= len1; i++) {
for (int j = 0; j <= len2; j++) {
if (i == 0 || j == 0) {
c[i][j] = 0;
}
else if (str1[i - 1] == str2[j - 1]) {
c[i][j] = c[i - 1][j - 1] + 1;
vec[i][j] = 0;
result = c[i][j] > result ? c[i][j] : result;
}
else {
c[i][j] = 0;
}
}
}
return result;
}

void print_lcs(vector<vector<int>>& vec, string str, int i, int j)
{
if (i == 0 || j == 0)
{
return;
}
if (vec[i][j] == 0)
{
print_lcs(vec, str, i - 1, j - 1);
printf("%c", str[i - 1]);
}
else if (vec[i][j] == 1)
{
print_lcs(vec, str, i - 1, j);
}
else
{
print_lcs(vec, str, i, j - 1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string str1 = "123456";
string str2 = "14568";
vector<vector<int>> vec(str1.size() + 1, vector<int>(str2.size() + 1, -1));
int result = lcs_2(str1, str2, vec);

cout << "result = " << result << endl;

print_lcs(vec, str1, str1.size(), str2.size());

getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: