Longest Common Subsequence

来源:互联网 发布:剑三妖孽男捏脸数据 编辑:程序博客网 时间:2024/04/30 10:23
       递归的解法是:
#include <stdio.h>

int inline max(int a,int b)
{
        
return a >= b ? a : b;
}
int lcs(char * a, int la, char *b, int lb)
{
        
if(la < 0 || lb < 0 ) return 0;
        
if(a[la] == b[lb]) return 1 + lcs(a,la-1,b,lb-1);
        
else return max(lcs(a,la-1,b,lb), lcs(a,la,b,lb-1));
}

int main()
{
        
char a[1024];
        
char b[1024];
        
int la,lb;
        
while(1)
        {
                printf(
":->");
                
if(fgets(a,1024,stdin) <= 0break;
                la 
= strlen(a) - 2;
                printf(
":->");
                
if(fgets(b,1024,stdin) <= 0break;
                lb 
= strlen(b) - 2;
                printf(
":->Common length is : %d ",lcs(a,la,b,lb));
        }
        
//printf("the common length is : %d  ",lcs(a,la,b,lb));
        return 0;
}

    这个解法效率太低,可以采用动态规划的方法来解决,实现的代码如下:
#include <stdio.h>
#include 
<string.h>

int commstr(char *str1, char *str2)
/* 返回str1,str2的最长公共之串长度*/
{
       
int len1=strlen(str1),len2=strlen(str2),row,col,max=0;
       
int **pf = new int*[len1+1];//动态分配一个二维数组作为辅助空间
       for (row=0; row<len1+1; row++)
              pf[row] 
= new int[len2+1];
       
//数组赋初值
       for (row=0; row<len1+1; row++)
              pf[row][
0= 0;
       
for (col=0; col<len2+1; col++)
              pf[
0][col] = 0;
      
for (row=1; row<=len1; row++)
              
for (col=1;col<=len2; col++)
              {
                     
if (str1[row-1== str2[col-1])
                     {
                            pf[row][col] 
= pf[row-1][col-1+ 1;
                            max 
= pf[row][col] > max ? pf[row][col] : max;
                     }
                     
else
                            pf[row][col] 
= 0;
              }

       
//空间回收    

       
for (row=0; row<len1+1; row++)
              delete[] pf[row];
       delete[] pf;
       
return max;                  
}

int main(int argc,char **argv)
{
       
if (argc >= 3)
       {
         printf(
"String: 1. %s 2. %s ",argv[1],argv[2]);
          printf(
" max substr length:%d ",commstr(argv[1],argv[2]));
       }
       
return 0;

原创粉丝点击