最长公共子序列问题
来源:互联网 发布:linux svn数据迁移 编辑:程序博客网 时间:2024/05/22 10:28
最长公共子序列问题
Time Limit: 1000MS Memory limit: 65536K
题目描述
给定两个序列X=
输入
输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。
输出
每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。
示例输入
ABCBDABBDCABA
示例输出
4
提示
这里主要是通过一个二维数组来储存公共子序列,(我们要区分一下公共子序列和子串啊!)
一层一层的来比较:
首先全都初始化:就是把带0的下标初始化为0就可以了。
然后用整个b字符串和a字符串比较,比如例题第一个a字符为A,则我们把所有b字符带A的全加一,,
一步一步来寻找,,
这里如果深入之后会带来问题:怎样加呢?
我们想啊:
1..如果a的第i个字符与b的第j个字符相等,那就在前一个的基础上加1,即a[i][j] = a[i-1][j-1]+1,,
有同学会问了。为什么?
因为我们找到相等后,就会在比较前一个数上加1,这里的前一个就是a[i-1][j-1]+1也是这一行及以前这一列及以前最大的,,
2..如果不相等时,我们想啊!,不相等哎!我们就找他前一个比较值那个打就行了a[i][j] = MAX(a[i][j-1],a[i-1][j])
为什么这里不是直接等于a[i-1][j-1]呢?
如果你有这样的问题就说明你还是不懂其中真意啊!!!~~
因为我们找的并不是真正比较的值而是找的在它之前最大的(这是关键),而我们找的a[i-1][j-1]并不一定是最大的,(前一个(也就是第一种情况)是因为加1故肯定是最大的)这与我们索要找的值不符,,是吧!如果你还不懂那你找个例题模拟一下!!
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #define N 600
- int main()
- {
- int n,m,i,j;
- int a[N][N];
- char x[N],y[N];
- while(gets(x)!=NULL)
- {
- gets(y);
- n = strlen(x);
- m = strlen(y);
- for(i = 0; i <= n; i++)
- {
- a[i][0] = 0;
- }
- for(i = 0; i <= m; i++)
- {
- a[0][i] = 0;
- }
- for(i = 1; i <= n; i++)
- {
- for(j = 1; j <= m; j++)
- {
- if(x[i-1]==y[j-1])
- {
- a[i][j] = a[i-1][j-1]+1;
- }
- else
- {
- if(a[i-1][j] > a[i][j-1])
- {
- a[i][j] = a[i-1][j];
- }
- else
- a[i][j] = a[i][j-1];
- }
- }
- }
- printf("%d\n",a[n][m]);
- }
- return 0;
- }
代码菜鸟,如有错误,请多包涵!!
0 0
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 最长公共子序列问题
- 搭建前端私有npm杂记
- 超链接
- java.lang.NoClassDefFoundError: javax/servlet/ServletContainerInitializer Jboss
- LeetCode:Top K Frequent Elements
- 使用正则表达式处理html标签方案分享
- 最长公共子序列问题
- ubuntu下安装shadowsocks
- Android——View的事件分发机制(学习Android开发艺术探索)
- Leetcode 23. Merge k Sorted Lists
- 如何做到像使用 LaTeX 那样优雅地使用 Word?
- 支付宝开发接口 Multiple dex files define Lcom/ta/utdid2/device/UTDevice
- c3p0重连机制
- Topographic Laser Ranging and Scanning Principles and Processing翻译
- 利用session做国际化引起的old区内存爆满及修复方法