对于这类题型,基本上都是用动态规划来解决。我们可以用两个for循环进行查找,然后用一个数组来记录相同字符的数量。
#include<stdio.h> #include<string.h> char a[1005]; char b[1005]; int dp[1005][1005]; int max(int a,int b){ return a>b?a:b; } int main(){ int T; int lena,lenb; scanf("%d",&T); while(T--){ scanf("%s",a); scanf("%s",b); lena=strlen(a); lenb=strlen(b); memset(dp,0,sizeof(dp)); for(int i=1;i<=lena;i++){ for(int j=1;j<=lenb;j++){ if(a[i-1]==b[j-1])dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//比较第一层for循环前一个和当前的相同字符数量 } } printf("%d\n",dp[lena][lenb]); } }优化后的代码:
#include <stdio.h> #include <string.h> char a[1001], b[1001]; int dp[1001], t, old, tmp; int main(){ scanf("%d", &t); getchar(); while(t--){ gets(a); gets(b); memset(dp, 0, sizeof(dp)); int lena=strlen(a), lenb=strlen(b); for(int i=0; i<lena; i++){ old=0; for(int j=0; j<lenb; j++){ tmp = dp[j]; if(a[i]==b[j]) dp[j] = old+1; else if(dp[j-1]>dp[j])dp[j]=dp[j-1]; old = tmp; //此处我们用old代替了dp[i-1][j-1] } } printf("%d\n", dp[lenb-1]); } return 0; }