最长公共子序列Lcs
来源:互联网 发布:数据直报系统 编辑:程序博客网 时间:2024/06/15 23:25
最长公共子序列Lcs
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Sample Input
abcicba
abdkscab
Sample Output
abca
代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int dp[1050][1050];int main(){ char a[1001],b[1001],c[1001]; while(gets(a)) { gets(b); int i,j; int len1=strlen(a); int len2=strlen(b); //printf("%d %d\n",len1,len2); for(i=0; i<=len1; i++) { dp[i][0]=0; } for(j=0; j<=len2; j++) { dp[0][j]=0; } for(i=1; i<=len1; i++) { for(j=1; j<=len2; j++) { if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]+1; } else { dp[i][j]=max( dp[i][j-1], dp[i-1][j] ); } } } /*for(i=0;i<=len1;i++) { for(j=0;j<=len2;j++) { printf("%d ",dp[i][j]); } printf("\n"); }*/ int k=0; for(i=len1; i>=0;) { for(j=len2; j>=0;) { if(a[i-1]==b[j-1]) { c[k]=a[i-1]; i--; j--; k++; } else { if(dp[i-1][j]>dp[i][j-1]) { i--; } else j--; } if(i<1||j<1) { i=-1; j=-1; break; } } } //printf("%d\n",k); for(i=k-1; i>=0; i--) { printf("%c",c[i]); } printf("\n"); } return 0;}
阅读全文
1 0
- LCS:最长公共子序列
- LCS---最长公共子序列
- 最长公共子序列 LCS
- LCS -- 最长公共子序列
- LCS最长公共子序列
- 最长公共子序列LCS
- LCS-最长公共子序列
- 最长公共子序列 LCS
- 最长公共子序列(LCS)
- 最长公共子序列(LCS)
- 最长公共子序列LCS
- LCS最长公共子序列
- 最长公共子序列LCS
- 最长公共子序列 LCS
- LCS最长公共子序列
- 最长公共子序列(LCS)
- 最长公共子序列LCS
- 最长公共子序列LCS
- 学习ArrayList 和 LinkedList小记【2】
- 每日一发Python---Python中的__name__和类
- CSS基础(二)基础样式
- c# 利用WaveOut播放音频流
- Bridge模式。
- 最长公共子序列Lcs
- 多线程进阶--volatile关键字解析
- Inception 初探
- 封装、静态
- Linux 系统管理-进程管理
- 计算机系统的虚拟内存
- table表头固定表体滚动
- 光学标定 (非计算机)
- Sagheer and Nubian Market