力扣1143. 最长公共子序列:https://leetcode-cn.com/problems/longest-common-subsequence/
- 确定dp数组
令dp[i][j]表示str1[0…i]和str2[0…j]的最长公共子序列
- 确定状态转移方程
对于str1[i]和str2[j]有两种情况:
a.
str1[i]==str2[j]时str1[i] ( str2[j] )可能在公共子序列中
此时根据dp数组定义
dp[i][j]=dp[i-1][j-1];
b.
str1[i]!=str2[j]
要么str1[i]在公共子序列中
要么str2[j]在公共子序列中
要饿str1[i]和str2[j]都不在公共子序列中
dp[ i ][ j ]=max(dp[ i-1 ][ j ],dp[ i ][ j-1 ],dp[ i-1 ][ j-1 ] );
其实只需要
dp[ i ][ j ]=max(dp[ i-1 ][ j ],dp[ i ][ j-1 ])即可因为dp[i-1][j-1]一直都是它们三个中最小的。
3.确定base条件
全零就行
代码
int longestCommonSubsequence(char * text1, char * text2){
int lena=strlen(text1);
int lenb=strlen(text2);
int num[lena+1][lenb+1];
memset(num,0,sizeof num);
for(int i=1;i<=lena;i++){
for(int j=1;j<=lenb;j++){
if(text1[i-1]==text2[j-1]){
num[i][j]=num[i-1][j-1]+1;
}
else{
num[i][j]=num[i-1][j]>num[i][j-1]?num[i-1][j]:num[i][j-1];
}
}
}
return num[lena][lenb];
}