【题目描述】
我们称序列Z=<z1,z2,...,zk>Z=<z1,z2,...,zk>是序列X=<x1,x2,...,xm>X=<x1,x2,...,xm>的子序列当且仅当存在严格上升的序列<i1,i2,...,ik><i1,i2,...,ik>,使得对j=1,2,...,k,有xij=zjxij=zj。比如Z=<a,b,f,c> 是X=<a,b,c,f,b,c>的子序列。
现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序列Z,使得Z既是X的子序列也是Y的子序列。
【输入】
输入包括多组测试数据。每组数据包括一行,给出两个长度不超过200的字符串,表示两个序列。两个字符串之间由若干个空格隔开。
【输出】
对每组输入数据,输出一行,给出两个序列的最大公共子序列的长度。
【输入样例】
abcfbc abfcab
programming contest
abcd mnp
【输出样例】
4
2
0
分析:求最长公共子序列LCS。
设有两个字符串
s[ls] t[lt]
f[x][y]表示s[1……x]和t[1……y]的最长公共子序列
如果s[x]不在公共子序列那么f[x][y]=f[x-1][y]
如果t[y]不在公共子序列那么f[x][y]=f[x][y-1]
如果s[x]和t[y]相等那么f[x][y]=f[x-1][y-1]+1;序列长度+1

本文介绍了如何解决信息学奥赛中的最长公共子序列问题,并提供了C++代码实现。通过动态规划方法,求解两个字符串的最大公共子序列的长度。
最低0.47元/天 解锁文章
17万+

被折叠的 条评论
为什么被折叠?



