C++实现最长公共子序列和最长公共子串
2016-07-14 21:36
706 查看
转载自:点击打开链接
![](https://img-blog.csdn.net/20160714213605997?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20160714213618965?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20160714213701185?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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;
}
// 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;
}
相关文章推荐
- java引用传递值传递的"深入"解析与c++中的值传递
- 链表的C++代码
- Remove Duplicates from Sorted Array
- C++11 std::bind笔记
- July 14th 模拟赛C T2 数码问题 Solution
- C++11 容器Array
- C++Primer课后练习exe6.33
- MFC中程序的延时
- Emacs下编译C++/C程序<转>
- Binary Tree Level Order Traversal II
- C++ 模板类的实现为何放在.h中
- 洛谷 P1969 [NOIP2013 D2T1] 积木大赛
- c语言中long long的用法
- c/c++中的extern
- C语言 程序 阶乘尾数零的个数
- Merge k Sorted Lists
- 常见C++面试问题总结1
- soci-mysq编译
- 关于java格式标示符与c语言格式标示符的误区?
- Valid Palindrome