最大匹配字元子串 深度優先
阿新 • • 發佈:2019-01-24
深度優先, 可以得出最大匹配數目, 但是無法輸出最大匹配字元子串。
#include "iostream" #include "cstring" using namespace std; #define len 1024 char a[len]; char b[len]; int max, length_a, length_b; void pull(int now_a, int now_b, int num){ int i, j; if(now_a == length_a || now_b == length_b){ if(max < num){ max = num; } return; } for(i = now_a; i < length_a; i++){ for(j = now_b ;j < length_b; j++){ if(a[i] == b[j]){ //相同的選擇它 pull(i + 1, j + 1, num+1); } //或者進入下一次迴圈, 放棄它 } //a陣列中這個字元, 可能沒有跟匹配的, 那麼進入下一次迴圈, 下次迴圈又得從now_b開始 } if(max < num) max= num; } int main(){ while(cin >> a && strcmp(a, "-1") && cin >> b){//輸入-1結束 max = 0; length_a = strlen(a); length_b = strlen(b); pull(0, 0, 0); cout<<"max= "<<max<<endl; memset(a, '0', sizeof(a)); memset(b, '1', sizeof(b)); } return 0; }
動態規劃,輸出公共子串, 程式來自http://blog.csdn.net/yysdsyl/article/details/4226630
#include <stdio.h> #include <string.h> #define MAXLEN 100 //x為第一個字串,y為第二個字串, m, n分別代表x, y訪問位置 //用c[i][j]記錄X[i]與Y[j] 的LCS 的長度 //b[][] void LCSLength(char *x, char *y, int m, int n, int c[][MAXLEN], int b[][MAXLEN]) { int i, j; for(i = 0; i <= m; i++) c[i][0] = 0; for(j = 1; j <= n; j++) c[0][j] = 0; for(i = 1; i<= m; i++) { for(j = 1; j <= n; j++) { if(x[i-1] == y[j-1]) //只有這兩個相等, 說明這個字元是公共的 { c[i][j] = c[i-1][j-1] + 1; b[i][j] = 0; } else if(c[i-1][j] >= c[i][j-1]) { c[i][j] = c[i-1][j]; b[i][j] = 1; } else { c[i][j] = c[i][j-1]; b[i][j] = -1; } } } } void PrintLCS(int b[][MAXLEN], char *x, int i, int j) { if(i == 0 || j == 0) return; if(b[i][j] == 0) //等於0才算是匹配上了 { PrintLCS(b, x, i-1, j-1); printf("%c ", x[i-1]); } else if(b[i][j] == 1) PrintLCS(b, x, i-1, j); else PrintLCS(b, x, i, j-1); } int main(int argc, char **argv) { char x[MAXLEN] = {"ABCBDAB"}; char y[MAXLEN] = {"BDCABA"}; int b[MAXLEN][MAXLEN]; int c[MAXLEN][MAXLEN]; int m, n; m = strlen(x); n = strlen(y); LCSLength(x, y, m, n, c, b); PrintLCS(b, x, m, n); return 0; }