最长公共子序列

来源:互联网 发布:理财网站源码交易平台 编辑:程序博客网 时间:2024/05/01 23:35

此题的目的是求两个字符串的最长公共子序列,例如abcfbc    abfcab最长公共子序列的长度是4;公共子序列是abfc;这是一道动态规划的题,这里给出两种方法,一种是求出长度的,另一种是求出公共的串,如果没有公共的子序列则第二种方法没有输出;

注意:如果是要提交杭电上面的最长公共子序列的那道题,你的数组不能开的太大,但是也不能太小了;500就已经足够了,如果太大会显示超内存的;

代码如下:


//第一种方法



#include <stdio.h>
#include <string.h>
const int mm=500;
char str1[mm],str2[mm];
int dp[mm][mm];
int main()
{
int i,j,len1,len2;
memset(dp,0,sizeof(dp));
 
  while(scanf("%s%s",str1,str2)!=-1)
{
len1=strlen(str1);
len2=strlen(str2);
for(i=0;i<len1;i++)
{
for(j=0;j<len2;j++)
{
if(str1[i]==str2[j])
{
dp[i+1][j+1]=dp[i][j]+1;
continue;
}   
if(dp[i+1][j]>dp[i][j+1])
{
dp[i+1][j+1]=dp[i+1][j];
}
else
{
dp[i+1][j+1]=dp[i][j+1];
}
}
}
printf("%d\n",dp[len1][len2]);
}
return 0;
}



/ /  第二种方法:


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;


const int maxn = 1000+100;
int dp[maxn][maxn], c[maxn][maxn];
char str1[maxn], str2[maxn];
void inital()
{
    memset(dp,0,sizeof(dp));
    memset(c,-1,sizeof(c));
}
void print(int i, int j)
{
    if(i<1 || j<1)return;
    if(c[i][j] == 0)
    {
        print(i-1,j-1);
        printf("%c",str1[i]);
    }
    if(c[i][j] == 1)
    {
        print(i-1,j);
    }
    if(c[i][j] == -1)
    {
        print(i,j-1);
    }
}
int main()
{
   while(scanf("%s%s",str1+1,str2+1) != EOF)
   {
       int len1 = strlen(str1+1), len2 = strlen(str2+1);
       inital();
       for(int i = 1; i <= len1; i++)
       {
           for(int j = 1; j <= len2; j++)
           {
               if(str1[i] == str2[j])
               {
                   dp[i][j] = dp[i-1][j-1]+1;c[i][j] = 0;
                   continue;
               }
               if(dp[i-1][j] > dp[i][j-1])
               {
                   dp[i][j] = dp[i-1][j];
                   c[i][j] = 1;
               }
               else
               {
                   dp[i][j] = dp[i][j-1];
                   c[i][j] = -1;
               }
           }
       }
        print(len1,len2);
   }
    return 0;
}



0 0
原创粉丝点击