用递归求解,复杂度为O(2^n),相当高
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
char array1[] = {'B', 'D', 'C', 'A', 'B', 'A'};
const int size1 = sizeof array1 / sizeof *array1;
char array2[] = {'A', 'B', 'C', 'B', 'D', 'A', 'B'};
const int size2 = sizeof array2 / sizeof *array2;
vector<char> cvec;
vector<char> cvec2;
int infor[size1][size2];
int findLongest(char (&array1)[size1], int pos1, char (&array2)[size2], int pos2)
{
if(pos1 < 0 || pos2 < 0) {
if(cvec2.size() < cvec.size()) {
cvec2 = cvec;
}
cvec.clear();
return cvec2.size();
}
int len1, len2;
if(array1[pos1] == array2[pos2]) {
cvec.push_back(array1[pos1]);
pos1 -= 1;
pos2 -= 1;
return findLongest(array1, pos1, array2, pos2);
} else {
len1 = findLongest(array1, pos1 - 1, array2, pos2);
len2 = findLongest(array1, pos1, array2, pos2 - 1);
return max(len1, len2);
}
}
void main()
{
int result = findLongest(array1, size1 - 1, array2, size2 - 1);
cout << "len: " << result << endl;
copy(cvec2.rbegin(), cvec2.rend(), ostream_iterator<char>(cout, " "));
}
利用动态规划法,以空间换取时间
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
using namespace std;
char array1[] = {'A', 'B', 'C', 'B', 'D', 'A', 'B'};
const int size1 = sizeof array1 / sizeof *array1;
char array2[] = {'B', 'D', 'C', 'A', 'B', 'A'};
const int size2 = sizeof array2 / sizeof *array2;
int info[size1 + 1][size2 + 1];
void printMatrix()
{
if (info == NULL)
return;
for (int i = 0; i <= size1; i++)
{
for (int j = 0; j <= size2; j++)
{
cout << info[i][j] << " ";
}
cout << endl;
}
}
int findLongestLcs(char *array1, int size1, char *array2, int size2)
{
if (array1 == NULL || array2 == NULL || size1 <= 0 || size2 <= 0)
return -1;
for (int i = 0; i <= size1; i++)
info[i][0] = 0;
for (int i = 0; i <= size2; i++)
info[0][i] = 0;
for (int i = 0; i < size1; i++)
{
for (int j = 0; j < size2; j++)
{
if (array1[i] == array2[j])
info[i + 1][j + 1] = info[i][j] + 1;
else
info[i + 1][j + 1] = max(info[i + 1][j], info[i][j + 1]);
}
}
printMatrix();
vector<char> result;
for (int i = size1, j = size2; i > 0 && j > 0;)
{
if (info[i][j] == info[i - 1][j] + 1 && info[i][j] == info[i][j - 1] + 1 && info[i][j] == info[i - 1][j - 1] + 1)
{
result.push_back(array1[i - 1]);
i--;
j--;
}
else if (info[i][j] == info[i - 1][j])
i--;
else
j--;
}
copy(result.rbegin(), result.rend(), ostream_iterator<char>(cout, " "));
return result.size();
}
void main()
{
int result = findLongestLcs(array1, size1, array2, size2);
cout << "len: " << result << endl;
}
4561

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



