Description
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
Input
输入为两行每行一个字符串
Output
输出最长公共子序列的长度
Sample Input 1
abcde ace
Sample Output 1
3
Sample Input 2
abbb c
Sample Output 2
0
#include<bits/stdc++.h>
using namespace std;
int lcs_length(const string&a, const string &b)
{
int m = a.size(),n = b.size();
vector<vector<int> > c(m + 1, vector<int> (n+1,0));
//c[i][j]代表存储Xi和Yj的最长公共子序列的长度
//X = {X1,X2,X3,...Xn} Y = {Y1,Y2,Y3,...Yn}
for(int i = 1; i <= m; i ++)
for(int j = 1; j <= n; j ++)
{
//由于字符串下标是从0开始,所以要减1
if(a[i-1] == b[j-1]) c[i][j] = c[i-1][j-1] + 1; //如果末尾一样长,那么序列同时前移,答案加1
else c[i][j] = max(c[i-1][j],c[i][j-1]);//末尾不一样长,那么选择其中长度较大的
}
return c[m][n];
}
int main()
{
string text1, text2;
cin >> text1 >> text2;
cout << lcs_length(text1,text2);
return 0;
}