0
点赞
收藏
分享

微信扫一扫

最长公共子序列

丹柯yx 2022-03-14 阅读 40

力扣1143. 最长公共子序列:https://leetcode-cn.com/problems/longest-common-subsequence/

  1. 确定dp数组

令dp[i][j]表示str1[0…i]和str2[0…j]的最长公共子序列

  1. 确定状态转移方程
    对于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];
}
举报

相关推荐

0 条评论