關(guān)鍵點(diǎn):
1.找出問題的遞歸表達(dá)式
2.然后根據(jù)表達(dá)式,直接轉(zhuǎn)化為矩陣上的數(shù)據(jù)運(yùn)算
本問題的遞歸表達(dá)式為:
L[i,j]等于 0 ifi=0 或者 j=0
等于L[i-1,j-1]+1 ifi>0 ,j>0 ai = bi
等于 max{L[i,j-1], L[i-1,j]} if i > 0 j>0, ai != bj
純c實(shí)現(xiàn)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define MAXSIZE 10
4 static char * LCSarray;
5 static char *start; //指向LCSarray數(shù)組中最長(zhǎng)公共字串的開始位置
6 int findLCS(char*, int, char*, int );
7
8 int main()
9 {
10 char * a = "0xyxxzxyzxy"; //第一位都沒有意義
11 char *b = "0zxzyyzxxyxxz";
12
13 LCSarray = (char *)malloc(sizeof(char)*MAXSIZE);//保存最長(zhǎng)公共字串的數(shù)組容器
14 int LCSNum = findLCS(a,10, b, 12);
15 printf("the result is: %d \n", LCSNum );
16 printf("the result char is: %s \n", start );
17
18 free(LCSarray);
19 exit(EXIT_SUCCESS);
20 }
21
22 int findLCS(char * a, int na, char *b, int nb)
23 {
24 int i = 0, j = 0; //i代表行下標(biāo)j代表列下標(biāo)
25 int t = 0; //保存最長(zhǎng)公共字串的下標(biāo)
26
27 //以下構(gòu)建矩陣
28 int ** matrix = (int **)malloc(sizeof(int *) * (na + 1));
29 for(i =0; i <na+1; i++)
30 matrix[i] = (int *) malloc(sizeof(int) * (nb +1));
31 //把第一行第一列都初始化為0
32 for(j = 0; j < nb +1; j++)
33 {
34 matrix[0][j] = 0;
35 }
36 for(i = 0; i < na +1; i++)
37 {
38 matrix[i][0] = 0;
39 }
40 //填該矩陣,即求解
41 for(i = 1; i < na + 1; i++)
42 {
43 for(j = 1; j < nb + 1; j++)
44 {
45 if(a[i] == b[j])
46 {
47 matrix[i][j] = matrix[i-1][j -1] + 1;
48 }
49 else
50 matrix[i][j] =matrix[i-1][j]>matrix[i][j-1]?matrix[i-1][j]:matrix[i][j-1];
51 }
52
53 }
54 //找出一個(gè)最大公共字串(一開始還以為是條捷徑呢,原來(lái)是謬誤,
55 //因?yàn)橹豢紤]最后一列比較,你不能確定較大值必定包含在全局的最大公共子序列中)
56 // int max = 0;
57 // for(i = 1; i < na +1; i++)
58 // {
59 // if(matrix[i][nb] > max)
60 // {
61 // LCSarray[t++] = a[i];
62 // max = matrix[i][nb];
63 // }
64 // }
65 /*從matrix尾部縱向優(yōu)先搜索,碰到兩個(gè)不同值時(shí)保存char,一直到第一行(其實(shí)最合理的應(yīng)該最后搜索到matrix[1][1]節(jié)點(diǎn))*/
66 i = na;
67 j = nb;
68 char * p = LCSarray + MAXSIZE-1; //指向尾部
69 * p = '\0';
70 while(i>0) //縱向搜索
71 {
72 while(matrix[i][j] == matrix[i-1][j])
73 {
74 i--;
75 };
76 *--p = a[i];
77 i--;
78 j--;
79 }
80 start = p;
81 //矩陣最后一個(gè)元素即是我們所需的最長(zhǎng)公共子序列的個(gè)數(shù)
82 int result = matrix[na][nb];
83 //釋放空間
84 for(i =0; i <na+1; i++)
85 free(matrix[i]);
86 free(matrix);
87 return result;
88 }
2 #include <stdlib.h>
3 #define MAXSIZE 10
4 static char * LCSarray;
5 static char *start; //指向LCSarray數(shù)組中最長(zhǎng)公共字串的開始位置
6 int findLCS(char*, int, char*, int );
7
8 int main()
9 {
10 char * a = "0xyxxzxyzxy"; //第一位都沒有意義
11 char *b = "0zxzyyzxxyxxz";
12
13 LCSarray = (char *)malloc(sizeof(char)*MAXSIZE);//保存最長(zhǎng)公共字串的數(shù)組容器
14 int LCSNum = findLCS(a,10, b, 12);
15 printf("the result is: %d \n", LCSNum );
16 printf("the result char is: %s \n", start );
17
18 free(LCSarray);
19 exit(EXIT_SUCCESS);
20 }
21
22 int findLCS(char * a, int na, char *b, int nb)
23 {
24 int i = 0, j = 0; //i代表行下標(biāo)j代表列下標(biāo)
25 int t = 0; //保存最長(zhǎng)公共字串的下標(biāo)
26
27 //以下構(gòu)建矩陣
28 int ** matrix = (int **)malloc(sizeof(int *) * (na + 1));
29 for(i =0; i <na+1; i++)
30 matrix[i] = (int *) malloc(sizeof(int) * (nb +1));
31 //把第一行第一列都初始化為0
32 for(j = 0; j < nb +1; j++)
33 {
34 matrix[0][j] = 0;
35 }
36 for(i = 0; i < na +1; i++)
37 {
38 matrix[i][0] = 0;
39 }
40 //填該矩陣,即求解
41 for(i = 1; i < na + 1; i++)
42 {
43 for(j = 1; j < nb + 1; j++)
44 {
45 if(a[i] == b[j])
46 {
47 matrix[i][j] = matrix[i-1][j -1] + 1;
48 }
49 else
50 matrix[i][j] =matrix[i-1][j]>matrix[i][j-1]?matrix[i-1][j]:matrix[i][j-1];
51 }
52
53 }
54 //找出一個(gè)最大公共字串(一開始還以為是條捷徑呢,原來(lái)是謬誤,
55 //因?yàn)橹豢紤]最后一列比較,你不能確定較大值必定包含在全局的最大公共子序列中)
56 // int max = 0;
57 // for(i = 1; i < na +1; i++)
58 // {
59 // if(matrix[i][nb] > max)
60 // {
61 // LCSarray[t++] = a[i];
62 // max = matrix[i][nb];
63 // }
64 // }
65 /*從matrix尾部縱向優(yōu)先搜索,碰到兩個(gè)不同值時(shí)保存char,一直到第一行(其實(shí)最合理的應(yīng)該最后搜索到matrix[1][1]節(jié)點(diǎn))*/
66 i = na;
67 j = nb;
68 char * p = LCSarray + MAXSIZE-1; //指向尾部
69 * p = '\0';
70 while(i>0) //縱向搜索
71 {
72 while(matrix[i][j] == matrix[i-1][j])
73 {
74 i--;
75 };
76 *--p = a[i];
77 i--;
78 j--;
79 }
80 start = p;
81 //矩陣最后一個(gè)元素即是我們所需的最長(zhǎng)公共子序列的個(gè)數(shù)
82 int result = matrix[na][nb];
83 //釋放空間
84 for(i =0; i <na+1; i++)
85 free(matrix[i]);
86 free(matrix);
87 return result;
88 }