1.最长公共子序列
0 i=0|| j=0
arr[i][j]= arr[i-1][j-1]+1 str1[i-1]=str[j-1] //str1第i个字符(下标为i-1)等于str2的第j个字符(下标为j-1)
max(arr[i-1][j],arr[i][j-1]) str1[i-1]!=str[j-1]
int LCS(string str1,string str2)
{
int m=str1.length()+1;
int n=str2.length()+1;
int arr[m][n];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(i==0||j==0)
{
arr[i][j]=0;
}
else if(str1[i-1]==str2[j-1])
{
arr[i][j]=arr[i-1][j-1]+1;
}
else arr[i][j]=max(arr[i-1][j],arr[i][j-1]);
}
}
return arr[m-1][n-1];
}
时间复杂度和空间复杂度都是O(m*n)
2.最长公共子串
0 i=0|| j=0
arr[i][j]= arr[i-1][j-1]+1 str1[i-1]=str[j-1] //str1第i个字符(下标为i-1)等于str2的第j个字符(下标为j-1)
0 str1[i-1]!=str[j-1]
int LCS(string str1,string str2)
{
int m=str1.length()+1;
int n=str2.length()+1;
int arr[m][n];
int ans=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(i==0||j==0)
{
arr[i][j]=0;
}
else if(str1[i-1]==str2[j-1])
{
ans=max(arr[i][j]=arr[i-1][j-1]+1,ans);
}
else arr[i][j]=0;
}
}
return ans;
}