码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划之最长公共子序列(LCS)

时间:2018-02-21 11:42:10      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:span   scanf   前缀   lcs   数组下标   字符串   string   子串   先后   

         在字符串S中按照其先后顺序依次取出若干个字符,并讲它们排列成一个新的字符串,这个字符串就被称为原字符串的子串

         有两个字符串S1和S2,求一个最长公共子串,即求字符串S3,它同时为S1和S2的子串,且要求它的长度最长,就是这里的

最长公共子序列问题。

          最长公共子序列问题的递推条件如下:dp[i][j]表示s1前i个字符组成的前缀子串与s2前j个字符组成的前缀子串的最长公共子序列

          dp[0][ j ]( 0<=j<=m) = 0

          dp[ i ][0]( 0<=i<=n) = 0

          dp[ i ] [ j ] = dp[ i-1][ j-1] + 1 ( s1[i]==s2[j] )

          dp[ i ][ j ] = max{ dp[i-1][ j ],dp[i][ j-1]  } ( s1[i] != s2[j] )

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int dp[100][100];
int max( int a,int b)
{
    //选取最大值
    return a>b? a:b;
}
int main()
{
    char s1[101],s2[101];
    int i,j;
    int l1,l2;
    while( scanf("%s%s",s1,s2)!=EOF){
        l1 = strlen(s1);
        l2 = strlen(s2);
        for( i=0; i<=l1; i++) dp[i][0] = 0;
        for( j=1; j<=l2; j++) dp[0][j] = 0;
        for( i=1; i<=l1; i++){
            for( j=1; j<=l2; j++){
                if( s1[i-1]!=s2[j-1])  //字符串数组下标从0开始
                    dp[i][j] = max( dp[i][j-1],dp[i-1][j]);
                else dp[i][j] = dp[i-1][j-1]+1;
            }
        }
        printf("%d\n",dp[l1][l2]);
    }

    return 0;
}

 

动态规划之最长公共子序列(LCS)

标签:span   scanf   前缀   lcs   数组下标   字符串   string   子串   先后   

原文地址:https://www.cnblogs.com/yuxiaoba/p/8456279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!