Description |
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is a subsequence of X if there exists a strictly increasing sequence <i1, i2, ..., ik> of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = <a, b, f, c> is a subsequence of X = <a, b, c, f, b, c> with index sequence <1, 2, 4, 6>. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y. |
Input |
The program input is from a text file. Each data set in the file contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct. |
Output |
For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line. |
Sample Input |
abcfbc abfcab programming contest abcd mnp |
Sample Output |
4 2 0 |
题目大意:给两个字符串,求最大公共子序列的长度。
先给出递归公式吧,下面来解释这个公式:
if(a[i]==b[j]) f[i][j]=f[i-1][j-1]+1;
if(a[i]!=b[j]) f[i][j]=max(f[i-1][j] || f[i][j-1])
拿 abcfbc abfcab 为例,先从两个串的第一个字母找,两个串的第一个字母都是a,f[1][1]=f[0][0]+1=1,
两个串第二个都是b,f[2][2]=f[1][1]+1=2;
两个串的第三个字母不相同,所以两个串的最长公共子序列就可能是 ab 和 abf 的最长公共子序列的长度或者是 abc 和 ab 的最长公共子序列的长度,最长长度还是2,以此类推最后求得最长子序列为4.
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int f[1005][1005];
int main()
{
string a,b;
while(cin>>a>>b)
{
int len1=a.size();
int len2=b.size();
int i,j;
//cout<<len1<<" "<<len2<<endl;
memset(f,0,sizeof(f));//先把数组初始化
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if(a[i-1]==b[j-1])//如果相等
{
f[i][j]=f[i-1][j-1]+1;//现在的最长公共子序列长度=上一次两个相比较的两个子串的最长公共子序列的长度+1
}
else//如果不相等
{
f[i][j]=max(f[i-1][j],f[i][j-1]);//现在的最长公共子序列长度=max(第一个子串不变,第二个子串加一个字母 || 第一个子串加一个字母,第二个子串不变)
}
}
}
cout<<f[len1][len2]<<endl;//结果就是两个子串都变成输入的两个串,比较完毕
}
}