1,首先要明白子序列的概念:
举个例子,cnblogs这个字符串中子序列有多少个呢?很显然有27个,比如其中的cb,cgs等等都是其子序列,我们可以看出
子序列不见得一定是连续的,连续的那是子串。
我想大家已经了解了子序列的概念,那现在可以延伸到两个字符串了,那么大家能够看出:cnblogs和belong的公共子序列吗?
在你找出的公共子序列中,你能找出最长的公共子序列吗?
从图中我们看到了最长公共子序列为blog,仔细想想我们可以发现其实最长公共子序列的个数不是唯一的,可能会有两个以上,
但是长度一定是唯一的,比如这里的最长公共子序列的长度为4。
2,核心是状态方程:
C - LCS
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.
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. 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
#include<stdio.h>
#include<string.h>
int z[1100][1100];
int cmp(int a,int b)
{
return a=a>b?a:b;
}
int main()
{
int i,j;
char s1[1100],s2[1100];
while(scanf("%s%s",s1+1,s2+1)!=EOF)//从一开始输入
{
int l=strlen(s1+1);
int k=strlen(s2+1);
memset(z,0,sizeof(z));
for(i=1;i<=l;i++)
{
for(j=1;j<=k;j++)
{
if(s1[i]==s2[j])
z[i][j]=z[i-1][j-1]+1;
else
z[i][j]=cmp(z[i-1][j],z[i][j-1]);
}
}
printf("%d\n",z[l][k]);
}
return 0;
}