最长公共子序列 | ||
---|---|---|
Time Limit: 1000 MS | Memory Limit: 5000 KB |
Description
给定两个字符串A和B, 请计算这两人个字符串的最长公共子序列长度。
Input
第一行输入M(M<=10)表示有M组数据。每组数据输入两行字符串, 字符串的长度不长于500。
Output
输出M行正整数,第i行表示第i组数据的最长公共子序列长度。
Sample Input
2
abcdefg
cemg
abcdefgh
ceaaegh
Sample Output
3
4
1.建立动态规划表
初始化第0行,第0列等于0;
2.进行动态比较,先填已知的部分,后根据已知序列推出未知序列。
#include <iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int n, N;
cin >> N;
for (int i = 0; i < N; i++) {
char a[500]; char b[500];
cin >> a >> b;
int lengthA = strlen(a), lengthB = strlen(b);
int bp[500][500];
for (int i = 0; i < lengthA; i++)
{
for (int j = 0; j < lengthB; j++) {
if (j==0||i==0)
{
bp[i][j] = 0; //初始化第一行第一列
}
if (a[i] == b[j ]) //从a[0],s[0]开始比较
bp[i+1][j+1] = bp[i][j] + 1; //如果相等,则i,j二者同时右移一位
else
//如果不相等,则i或者j左移一位,即stringa的【0,i+1】与stringb的【0,j】比较最长子序列
//或stringa的【0,i】与stringb的【0,j+1】比较最长子序列,
//去二者的较大值
bp[i+1][j+1] = max(bp[i][j+1], bp[i+1][j]); //取最大值
}
}
cout << bp[lengthA][lengthB];
cout << endl;
}
return 0;
}