在字符串S中按照其先后顺序依次取出若干个字符,并讲它们排列成一个新的字符串,这个字符串就被称为原字符串的子串
有两个字符串S1和S2,求一个最长公共子串,即求字符串S3,它同时为S1和S2的子串,且要求它的长度最长,就是这里的
最长公共子序列问题。
最长公共子序列问题的递推条件如下:dp[i][j]表示s1前i个字符组成的前缀子串与s2前j个字符组成的前缀子串的最长公共子序列
dp[0][ j ]( 0<=j<=m) = 0
dp[ i ][0]( 0<=i<=n) = 0
dp[ i ] [ j ] = dp[ i-1][ j-1] + 1 ( s1[i]==s2[j] )
dp[ i ][ j ] = max{ dp[i-1][ j ],dp[i][ j-1] } ( s1[i] != s2[j] )
#include<stdio.h> #include<stdlib.h> #include<string.h> int dp[100][100]; int max( int a,int b) { //选取最大值 return a>b? a:b; } int main() { char s1[101],s2[101]; int i,j; int l1,l2; while( scanf("%s%s",s1,s2)!=EOF){ l1 = strlen(s1); l2 = strlen(s2); for( i=0; i<=l1; i++) dp[i][0] = 0; for( j=1; j<=l2; j++) dp[0][j] = 0; for( i=1; i<=l1; i++){ for( j=1; j<=l2; j++){ if( s1[i-1]!=s2[j-1]) //字符串数组下标从0开始 dp[i][j] = max( dp[i][j-1],dp[i-1][j]); else dp[i][j] = dp[i-1][j-1]+1; } } printf("%d\n",dp[l1][l2]); } return 0; }