动态规划
既然是经典的题目肯定是有优化空间的,并且解题方式是有固定流程的,这里我们采用的是矩阵实现,也就是二维数组。
第一步:先计算最长公共子序列的长度。
第二步:根据长度,然后通过回溯求出最长公共子序列。
现有两个序列X={x1,x2,x3,...xi},Y={y1,y2,y3,....,yi},
设一个C[i,j]: 保存Xi与Yj的LCS的长度。
递推方程为:
#include "stdafx.h"
#include<string>
using namespace std;
int Finsubstring(string A,string B)
{
int An = A.size();
int Bn = B.size();
int **S=new int*[An];
for (int i = 0; i <= An; i++)
S[i] = new int[Bn+1];
for (int i = 0; i <= An;i++)
for (int j = 0; j <= Bn; j++)
{
if (i == 0 || j == 0)
S[i][j] = 0;
if (A[i] == B[j]&&i>0&&j>0)
S[i][j] = S[i-1][j-1] + 1;
if (A[i] != B[j] && i>0 && j>0)
S[i][j] = S[i][j - 1]>S[i - 1][j] ? S[i][j - 1] : S[i - 1][j];
}
return S[An][Bn];
}
int main()
{
string A="cnblogs";
string B="belong";
int result = Finsubstring(A, B);
printf("%d",result);
return 0;
}