http://blog.youkuaiyun.com/zzuchengming/article/details/50822735
实现代码如下:
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- void lcs(char *a, char *b, int m, int n, int **c, int **s)
- {
- if (m == 0 || n == 0 || a == NULL || b == NULL )
- {
- return;
- }
- int i,j;
- for (i = 0; i <= m; i++)
- {
- c[i][0] = 0;
- }
- for (j = 1; j <= n; j++)
- {
- c[0][j] = 0;
- }
- for (i = 1; i <= m; i++)
- {
- for (j = 1; j <= n; j++)
- {
- if (a[i-1] == b[j-1])//注意
- {
- c[i][j] = c[i-1][j-1] + 1;//c[i][j]对应的是a[0到i-1]与b[0到j-1]的公共子序列
- s[i][j] = 0;
- }
- else
- if (c[i-1][j] > c[i][j-1])
- {
- c[i][j] = c[i-1][j];
- s[i][j] = 1;
- }
- else
- {
- c[i][j] = c[i][j-1];
- s[i][j] = -1;
- }
- }
- }
- }
- void printlcs(char *a, int line, int row, int **c, int **s)
- {
- //if (line == 0 || row == 0)
- //{
- // return;
- //}
- if (c[line][row] == 0)//为什么加这个
- {
- return;
- }
- int i = line, j = row;
- if (s[i][j] == 0)
- {
- cout << a[i - 1] << ' ';//为什么不是输出a[i]
- printlcs(a, i - 1, j - 1, c, s);
- }
- else
- if (s[i][j] == 1)
- {
- printlcs(a, i - 1, j, c, s);
- }
- else
- printlcs(a, i, j - 1, c ,s);
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- char a[] = "abcbdab";
- char b[] = "bdcaba";
- int length1 = sizeof(a)/sizeof(a[0]);
- int length2 = sizeof(b)/sizeof(b[0]);
- int **c = new int*[length1];
- int **s = new int*[length1];
- for (int i = 0; i < length1; i++)
- {
- c[i] = new int[length2];
- s[i] = new int[length2];
- }
- lcs(a, b, length1 - 1, length2 - 1, c, s);
- cout << c[length1 - 1][length2 - 1];
- printlcs(a, length1 - 1, length2 - 1, c, s);
- system("pause");
- return 0;
- }