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.
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. 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.
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. 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.
abcfbc abfcab programming contest abcd mnp
4 2 0
abcfbc abfcab programming contest abcd mnp
4 2 0
题意:找到两字符串的最大子串数
题解:以 abcfbc abfcab 为例,可以找到4为最长子序列,给出空间辅助示意图便于寻找规律:
由图可见:
当a[i]==b[j]时,F[i][j]=F[i-1][j-1]+1;//左上公共子序列+1
当a[i]!=b[j]时,max(F[i-1][j],F[i][j-1]);//玩做或往右寻找最大值
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
char s1[1005];
char s2[1005];
int dp[1005][1005];
int main(){
while(cin>>s1>>s2){
int n=strlen(s1);
int m=strlen(s2);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
//从辅助空间变化示意图求得规律
if(s1[i-1]==s2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
cout<<dp[n][m]<<endl;
}
return 0;
}