B.Common Subsequence | |||||
| |||||
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. | |||||
Input | |||||
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. | |||||
Output | |||||
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 |
https://blog.youkuaiyun.com/a995549572/article/details/50829875
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int f[1100][1100];
char s1[1000], s2[1000];
int len1, len2;
int main()
{
while(scanf("%s %s", s1, s2) != EOF)
{
len1 = strlen(s1);
len2 = strlen(s2);
memset(f, 0, sizeof(f));
for(int i = 1;i <= len1; ++i)
{
for(int j = 1;j <= len2; ++j)
{
if(s1[i-1] == s2[j-1]) f[i][j] = f[i-1][j-1]+1;
else
{
f[i][j] = max(f[i-1][j], f[i][j-1]);
}
}
}
cout << f[len1][len2] << endl;
}
return 0;
}