最长公共子序列
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。-
输入
-
第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.
输出
- 每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。 样例输入
-
2 asdf adfsd 123abc abc123abc
样例输出
-
3 6
-
第一行给出一个整数N(0<N<100)表示待测数据组数
运用动态规划的思想解题,建立一个二维的数组,array[x][y],那么就表示第一个字符串的前x位和第二个字符串的前y位的最大公共子序列,那么可以得到递推是就是如果str1[x] == str2[y] 那么array[x][y] = array[x -1][y - 1] +1,如果不相等,则array[x][y] = max(array[x - 1][y], array[x][y - 1])
#include<stdio.h>
int array[1001][1001];
int main()
{
int num , i , j;
char str1[1001] , str2[1001];
scanf("%d" , &num);
getchar();
while(num--)
{
gets(str1);
gets(str2);
for(i = 0 ; str1[i - 1] ; i++)
array[i][0] = 0;
for(j = 0 ; str2[j - 1] ; j++)
array[0][j] = 0;
for(i = 1 ; str1[i - 1]; i++)
{
for(j = 1 ; str2[j - 1]; j++)
{
if(str1[i - 1] == str2[j - 1])
array[i][j] = array[i - 1][j - 1] + 1;
else
{
if(array[i - 1][j] > array[i][j - 1])
array[i][j] = array[i - 1][j];
else
array[i][j] = array[i][j - 1];
}
// printf("%d " , array[i][j]);
}
// printf("\n");
}
printf("%d\n" , array[i - 1][j - 1]);
}
return 0;
}