算法之最长公共子序列

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

给定两个字符串求两个字符串的最长公共子序列。这让我们最先想到的一定是用穷举法将两个字符串的子序列分别列出来,然后比对,最长的既是答案。
没错,这样也可以做出来,但是一个长度为m的字符串子序列有2^m个,无疑穷举法太过于缓慢。
我们假设参照序列有m个,比对序列有n个,恰好有两种情况
一、
恰好两个序列最后一个字符相等,那这两个字符串的最长公共子序列就等于m-1,n-1这两个字符串的最长公共子序列+1。即L【m,n】=L【m-1,n-1】+1;
二、
恰好两个序列最后一个字符不相等,那这两个字符串的最长公共子序列就等于m-1,n或m,n-1这两个字符串的最长公共子序列。即L【m,n】=max(L【m-1,n】,L【m,n-1】)
直到i,或者j等于0的时候 ,既然有一个字符串为0,那么公共子序列自然没有就是0;
以上假设既是证明了存在最优子结构
如此,现在来分析代码如何写
代码很简单,就分为了两个部分,一个是初始化阶段,第二个就是用双重循环求解
第一部分
在这里插入图片描述
这一部分唯一需要注意的是字符串的输入与整形不同要注意空格和回车输入进字符串中,我们可以采用getchar(),吸收掉不需要进入字符串的回车等。
第二部分
在这里插入图片描述
L【100】【100】我定义成了全局变量并且全部初始化为0。局部变量也可以,传入函数内即可
然后就是重头戏,双重循环
第一重的 i 表示参照字符串的长度
第二重的 j 表示比对字符串的长度
从参照字符串等于1开始,开始与比对字符串开始比对,从1个到n个
只要相等那么L【m,n】=L【m-1,n-1】+1,反正L【0】【1–n】=0;
如果不等那就是L【m,n】=max(L【m-1,n】,L【m,n-1】)
直到找出m,n
L【m】【n】就表示参照字符串长为m,比对字符串长为n的最长公共子序列的长度
行文至此,本题也就解决,感谢品读,你我共同进步!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值