时间复杂度
$O(n^2)$
C++ 代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
//根据题意:最长公共子序列不一定连续
int N,M;
cin>>N>>M;
//注意:字符是从字符串的下标0开始存的
string A,B;
cin>>A>>B;
int lenA=A.length();
int lenB=B.length();
if(N!=lenA || M!=lenB)
return -1;//输入异常
//动态规划求解
//dp[i][j]表示字符串A,B分别以第i,j(i>0,j>0)个字符结尾的那部分字符串的最长公共子序列的长度
int dp[N+1][M+1];
for(int i=0;i<N+1;++i)
dp[i][0]=0;
for(int j=0;j<M+1;++j)
dp[0][j]=0;
for(int i=1;i<N+1;++i)
{
for(int j=1;j<M+1;++j)
{
if(A[i-1]==B[j-1])//-1是因为字符是从字符串的下标0开始存的
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[N][M]<<endl;
return 0;
}