求两个字符串的最长公共子序列

 

//autor:baker

//time:25/5/06

//email:baker1203@sina.com

/*    求两个字符串的最长公共子序列。

X的一个子序列是相应于X下标序列{1, 2, …, m}的一个子序列,求解两个序列的所有子序列中长度最大的,例如输入:pear, peach输出:pea。

 

分析:

   次题可用动态规划算法解决。

首先定义一个二维数组:A【】【】;

A[i][j]

M

G

D

D

G

0

1

0

0

g

0

1

0

0

d

0

0

2

1

d

0

0

0

3

 

如上,A[I][J]表示在此字符以前互相匹配的字符数目,当MAX=MAX(MAX,A[I][J])为最大时,即求得最大匹配子串。

当STR1[I]=STR2[J]时,A[I][J]=A[I-1][J-1]+1,即左上方最大匹配字符数目加一。

当MAX为最大时,记录下当前扫描STR1的位置为TAG

(2)源代码如下:

*/

#include"iostream"

#include"conio.h"

#include"string"

using namespace std;

 

void maxstring(string str1,string str2)

{

     int max=0,tag,i,j;

     int length1=str1.size();

     int length2=str2.size();

     int a[length1+1][length2+1];

   

    

     for(i=0;i<=length1;i++)

        for(j=0;j<=length2;j++)

        a[i][j]=0;

       

     for(i=1;i<=length1;i++)

        for(j=1;j<=length2;j++)

          if(str1[i]==str2[j])

          {

            a[i][j]=a[i-1][j-1]+1;

            if(max<a[i][j])

            {

             max=a[i][j];

             tag=i;

            }

          }

     if(max==0){cout<<"no found same string!";return ;}

     cout<<"output the max same string:";

     for(i=tag-max;i<=tag;i++)      

               cout<<str1[i];

     

      cout<<endl<<"the length is:"<<max<<endl;

 

}

 

int main()

{

    string str1,str2;

    cout<<"enter the two strings!"<<endl;

    cout<<"string 1:";

    cin>>str1;

    cout<<"string 2:";

    cin>>str2;

    maxstring(str1,str2);

    getch();

    return 0;

}

 

 

/*(4)程序截图:

 

 

 

 

*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值