最长公共子序列:
例如:abcfbc
abfcb 答案是:4;
最长公共子串 :答案是: 2;
代码:
最长公共子序列:
#include<cstdio> #include<cstring> #define max(x,y) (x>y?x:y) int len1,len2; int dp[1010][1010]; int bj[1010][1010]; char ch1[1010],ch2[1010]; void LCS() //lcs最长公共子序列模板 { int i,j; for(i=1;i<=len1;++i) { for(j=1;j<=len2;++j) { if(ch1[i-1]==ch2[j-1]) { dp[i][j]=dp[i-1][j-1]+1; bj[i][j]=1; } else if(dp[i-1][j]>=dp[i][j-1]) { dp[i][j]=dp[i-1][j]; bj[i][j]=0; } else { dp[i][j]=dp[i][j-1]; bj[i][j]=2; } } } } void PRINTF(int i,int j) //输出最长公共子序列 { if(i==0||j==0) return ; if(bj[i][j]==1) { PRINTF(i-1,j-1); printf("%c",ch1[i-1]); } else if(bj[i][i]==0) PRINTF(i-1,j); else PRINTF(i,j-1); } int main() { int len; while(scanf("%s%s",ch1,ch2)!=EOF) { memset(dp,0,sizeof(dp)); //清零 memset(bj,0,sizeof(bj)); len1=strlen(ch1); len2=strlen(ch2); LCS(); len=dp[len1][len2]; //最长公共子序列的长度 printf("%d\n",len); PRINTF(len1,len2); //输出最长公共子序列 printf("\n"); } return 0; }
最长公共子串:
代码:
//找出两个字符串的最长公共连续子串的长度 #include<cstdio> #include<cstring> char ch1[1010],ch2[1010]; char ch[1010]; //存放最大连续子串 int bj[1010][1010]; int len1,len2,max_len,xi,yj; void LCS_string() //最大连续子串长度 { int i,j; max_len = -1; for(i=1;i<len1+1;i++) { for(j=1;j<len2+1;j++) { if(ch1[i-1]==ch2[j-1]) bj[i][j]=bj[i-1][j-1]+1; else bj[i][j]=0; if(bj[i][j]>max_len) { max_len=bj[i][j]; xi=i; yj=j; } } } } void MAX_string() //求最大连续子串 { int n=max_len; int i,j; ch[n--]='\0'; i=xi-1; j=yj-1; while(i>=0&&j>=0) { if(ch1[i]==ch2[j]) { ch[n--]=ch1[i]; i--; j--; } else break; } } int main() { while(scanf("%s%s",ch1,ch2)!=EOF) { len1=strlen(ch1); len2=strlen(ch2); memset(ch,'\0',sizeof(ch)); memset(bj,0,sizeof(bj)); LCS_string(); printf("最大连续子串长度: %d\n",max_len); MAX_string(); printf("最大连续子串: %s\n",ch); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-06 07:35:22