算法面试题(二)-- 最长公共子序列(LCS)与苦恼的月下老人

这是一个典型的动态规划题,属于求两个字符串的最长公共子序列问题,如果你手边有《算法导论》这本书,这个问题就可以在书中找到;求量个序列中最长的公共子序列算法。广泛的被应用在图像相似处理、媒体流的相似比较、计算生物学方面,生物学家尝尝利用该算法进行基因序列比对,由此推测学列的结构、功能和演化进程。另外,LCS算法可以用来描述两端文字之间的相似度,即它们的雷同度,通常备用在论文的查重检测上;另另外,对一段文字进行修改之后,将除此序列外的部分提取出来,这种用来判断修改部分的方法十分准确。

这一问题的求解方法,如果我们用暴力法来解决,就是利用穷举法,对每一个子序列都检查是否是子序列,显然比较慢,所以我们有更好的方法来解决该问题。

LCS问题可以归结为下面公式:



Code:

int LCS(const char *Male,const char *Female)
    {
        int N = (int)strlen(Male);
        int M = (int)strlen(Female);
        int pair[1001][1001];//配对结果矩阵
        //初始化
        for (int i = 0; i < N; i ++)
        {
            pair[i][0] = 0;
        }
        for (int i = 0; i < M; i ++)
        {
            pair[0][i] = 0;
        }
        
        for (int i = 1; i <= N; i ++)
        {
            for (int j = 1; j <= M; j ++)
            {
                if (Male[i-1] == Female[j-1])
                    pair[i][j] = pair[i-1][j-1] + 1;
                else
                {
                    if (pair[i-1][j] > pair[i][j-1])
                        pair[i][j] = pair[i-1][j];
                    else
                        pair[i][j]=pair[i][j-1];
                }
            }
        }
        
        return pair[N][M];
    }


int  main()
{
    const char Male[1001];
    const char Female[1001];
    scanf("%s\r\n%s",Male,Female);
    printf("%d",LCS(Male,Female));
    return 0;
}

result:



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值