1006 最長公共子序列
阿新 • • 發佈:2018-12-18
題目描述
給出兩個字串A B,求A與B的最長公共子序列(子序列不要求是連續的)。 比如兩個串為:
abcicba abdkscab
ab是兩個串的子序列,abc也是,abca也是,其中abca是這兩個字串最長的子序列。
輸入
第1行:字串A 第2行:字串B (A,B的長度 <= 1000)
輸出
輸出最長的子序列,如果有多個,隨意輸出1個。
程式碼實現
#include<iostream> #include<cstring> #include<algorithm> #include <stdio.h> using namespace std; void print_string(char* s1,char* s2,int** b,int length1,int length2){ if(length1==0||length2==0){ return; } if(b[length1][length2]==0){ print_string(s1,s2,b,length1-1,length2); } else if(b[length1][length2]==1){ print_string(s1,s2,b,length1-1,length2-1); cout<<s1[length1-1]; } else{ print_string(s1,s2,b,length1,length2-1); } } int find(char* s1,char* s2,int** b){ int length1=strlen(s1); int length2=strlen(s2); int **c = new int*[length1+1]; for(int i= 0; i < length1+1; i++){ c[i] = new int[length2+1]; } for(int i=0;i<length1+1;i++){ c[i][0]=0; } for(int i=0;i<length2+1;i++){ c[0][i]=0; } for(int i=1;i<length1+1;i++){ for(int j=1;j<length2+1;j++){ if(s1[i-1]==s2[j-1]){ c[i][j]=c[i-1][j-1]+1; b[i][j]=1; } else{ c[i][j]=max(c[i-1][j],c[i][j-1]); if(c[i-1][j]>=c[i][j-1]){ b[i][j]=0; } else{ b[i][j]=-1; } } } } return c[length1][length2]; } int main(){ char s1[10000]; char s2[10000]; string result=""; gets(s1); gets(s2); int **b = new int*[strlen(s1)+1]; for(int i= 0; i < strlen(s1)+1; i++){ b[i] = new int[strlen(s2)+1]; } int maxLen=find(s1,s2,b); print_string(s1,s2,b,strlen(s1),strlen(s2)); return 0; }
總結
用動規解決