最长公共子序列问题
Problem Description
给定两个序列 X={x1,x2,…,xm} 和 Y={y1,y2,…,yn},找出X和Y的最长公共子序列。
Input
输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。
Output
每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。
Sample Input
ABCBDAB BDCABA
Sample Output
4
#include<stdio.h>
#include<string.h>
int w[10001][10001]; //一开始数组开大了,导致我的cb无法编译
int main(void)
{
char a[1000], b[1000];
int i, len1, len2, j;
while(gets(a) != NULL)
{
//这里不能用getchar,因为没有用scanf来读取东西,所以不需要getchar来吸收,若用了,则会误吸收一个字符
gets(b);
len1 = strlen(a);
// printf("%d\n", len1);
len2 = strlen(b);
w[len1][len2] = 0;
for(i = 0; i <= len1; i++)
{
w[i][0] = 0; //初始化边界条件,i指a中的所有字母与b中没有字母时。
}
for(j = 0; j <= len2; j++)
{
w[0][j] = 0;
}
for(i = 1; i <= len1; i++)
{
for(j = 1; j <= len2; j++)
{
if(a[i - 1] == b[j - 1]) //因为是数组,所以可以直接判断相不相等
{
w[i][j] = w[i - 1][j - 1] + 1; //这里要等于len1与len2,因为最后一个相不相等存储下来的数要放到他的下一个空间来存储
}
else //如果不相等,就看看单独的时候那个大
{
if(w[i - 1][j] > w[i][j - 1])
{
w[i][j] = w[i - 1][j];
}
else
{
w[i][j] = w[i][j - 1];
}
}
}
}
printf("%d\n", w[len1][len2]);
}
return 0;
}