最长公共子序列
描述
如题,需要你做的就是写一个程序,得出最长公共子序列。tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.
每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1001
#define maxValue(a,b) ((a)>(b) ? (a) : (b))
int lcs[MAX_LEN][MAX_LEN] = {0,};
int main()
{
int N;
char strA[MAX_LEN];
char strB[MAX_LEN];
scanf("%d",&N);
while (N--)
{
int i = 0;
int j = 0;
int aLen = 0;
int bLen = 0; // 字符串A的长度 字符串 B的长度
scanf("%s%s",strA+1,strB+1);
aLen = strlen(strA+1);
bLen = strlen(strB+1); // 从1 开始计数
for (i = 0; i < aLen; i++)
lcs[i][0] = 0;
for (j = 0; j < bLen; j++)
lcs[0][j] = 0;
for (i = 1; i <= aLen; i++)
{
for (j = 1; j <= bLen; j++)
{
if (strA[i] == strB[j])
{
lcs[i][j] = lcs[i-1][j-1] + 1; // 注意此处
}
else
{
lcs[i][j] = maxValue(lcs[i-1][j],lcs[i][j-1]);
}
}
}
printf("%d\n",lcs[aLen][bLen]);
}
return 0;
}