题目描述:
字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj。
例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。
给定两个字符串,求他们的最长公共子序列。
输入:
输入两行,每行输入一个字符串,只包括小写字母。
输出:
输出最长公共子序列长度。
样例输入:
abcfbc
abfcab
样例输出:
4
最长公共子串和最长公共子序列的区别为:子串是串的一个连续部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新的序列;也就是说。子串中字符的位置必须是连续的,子序列则可以不必连续。
代码来喽:
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; char s1[1005],s2[1005]; int dp[1005][1005]; int main() { while(scanf("%s%s",s1+1,s2+1)!=EOF) { int n=strlen(s1+1),m=strlen(s2+1); dp[0][0]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(s1[i]==s2[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i][j-1],dp[i-1][j]); } printf("%d ",dp[n][m]); } return 0; }