LCS练习

给定两个字符串A和B,返回两个字符串的最长公共子序列的长度。例如,A=”1A2C3D4B56”,B=”B1D23CA45B6A”,”123456”或者”12C4B6”都是最长公共子序列。

给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。

测试样例:
“1A2C3D4B56”,10,”B1D23CA45B6A”,12
返回:6

申请一个数组dp[m][n]用来存储以i,j结尾的最大公共子序列.遍历一遍找出dp数组中的最大值即可
dp[i][j]可能的最大值右三种情况
1.dp[i-1][j]
2.dp[i][j-1]
3 若A[i]==B[j] 则还有可能是dp[i-1][j-1]+1;

class LCS {
public:
    int findLCS(string A, int n, string B, int m) {
        if(n<1||m<1)
            return 0;
        int dp[n][m];
        memset(dp,0,sizeof(dp));
        int flag=0;
        for(int i=0;i!=m;++i)
            {
                if(A[0]==B[i]||flag)
                    {
                    dp[0][i]=1;
                    flag=1;
                }
            }
        flag=0;
        for(int i=0;i!=n;++i)
            {
                if(A[i]==B[0]||flag)
                    {
                    dp[i][0]=1;
                    flag=1;
                }
            }
        for(int i=1;i!=n;++i)
            {
            for(int j=1;j!=m;++j)
                {
                if(A[i]==B[j])
                dp[i][j]=max(max(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]+1);
                else
                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
       return dp[n-1][m-1]; 
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言实现的LCS算法示例代码,供参考: ```c #include <stdio.h> #include <string.h> #include <math.h> #define MAXLEN 1000 int dist[MAXLEN][MAXLEN]; int path[MAXLEN][MAXLEN]; void lcs2(char* seq1, char* seq2) { int len1 = strlen(seq1); int len2 = strlen(seq2); // 初始化dist和path数组 for (int i = 0; i <= len1; i++) { dist[i][0] = 0; path[i][0] = 0; } for (int j = 0; j <= len2; j++) { dist[0][j] = 0; path[0][j] = 0; } // 动态规划计算dist和path数组 for (int i = 1; i <= len1; i++) { for (int j = 1; j <= len2; j++) { if (seq1[i-1] == seq2[j-1]) { dist[i][j] = dist[i-1][j-1] + 1; path[i][j] = 1; } else if (dist[i-1][j] >= dist[i][j-1]) { dist[i][j] = dist[i-1][j]; path[i][j] = 2; } else { dist[i][j] = dist[i][j-1]; path[i][j] = 3; } } } // 从path数组中回溯出LCS int i = len1, j = len2, k = dist[len1][len2]; char lcs[MAXLEN]; while (k > 0) { if (path[i][j] == 1) { lcs[--k] = seq1[i-1]; i--; j--; } else if (path[i][j] == 2) { i--; } else { j--; } } // 输出结果 printf("Seq1: %s (%d)\n", seq1, len1); printf("Seq2: %s (%d)\n", seq2, len2); printf("LCS: "); for (int i = 0; i < dist[len1][len2]; i++) { printf("%c", lcs[i]); } printf(" (%d)\n", dist[len1][len2]); printf("SimS: %.2f\n", dist[len1][len2]/sqrt(len1*len2)); } int main() { char seq1[] = "ABCBDAB"; char seq2[] = "BDCABA"; lcs2(seq1, seq2); char seq3[] = "ACCGGTCGAGTGCGCGGAAGCCGGCCGGAA"; char seq4[] = "GTCGTTCGGAATGCCGTTGCTCTGTAAA"; lcs2(seq3, seq4); return 0; } ``` 输出结果为: ``` Seq1: ABCBDAB (7) Seq2: BDCABA (6) LCS: BCBA (4) SimS: 0.62 Seq1: ACCGGTCGAGTGCGCGGAAGCCGGCCGGAA (30) Seq2: GTCGTTCGGAATGCCGTTGCTCTGTAAA (28) LCS: GTCGTCGGAAGCCGGCCGAA (20) SimS: 0.69 ``` 其中,dist数组存储了最长公共子序列的长度,path数组存储了回溯路径,用于回溯出最长公共子序列。最后根据公式计算出相似度SimS。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值