int main() { char *x = "ABCBDAB"; char *y = "BDCABA"; int m = 7, n = 6; int *b; int c; c = lcs_length(x, y, m, n, &b); printf("longest common subsequence length: %d\n", c); printf("longest common subsequence is: "); print_lcs(b, x, m, n); puts(""); free(b); x = "ACCGGTCGAGTGCGCGGAAGCCGGCCGAA"; m = 29; y = "GTCGTTCGGAATGCCGTTGCTCTGTAAA"; n = 28; c = lcs_length(x, y, m, n, &b); printf("longest common subsequence length: %d\n", c); printf("longest common subsequence is: "); print_lcs(b, x, m, n); puts(""); free(b); return 0; }
void print_lcs(int *b, char *X, int i, int j, int n) { if(i == 0 || j == 0){ return ; }else if(*(b + i*n + j) == 1){ print_lcs(b, X, i-1, j-1, n); printf("%c", X[i]); }else if(*(b + i*n + j) == 2){ print_lcs(b, X, i-1, j, n); }else{ print_lcs(b, X, i, j-1, n); } }
void print_lcs(char dir[M+1][N+1], char x[M], int i, int j) { if(i<0 || j<0) return; if(dir[i][j] == 'd') { print_lcs(dir, x, i-1, j-1); printf("%c", x[i-1]); } else if(dir[i][j] == 'u') print_lcs(dir, x, i-1, j); else print_lcs(dir, x, i, j-1); }
void print_lcs(char b[][20],char x[],int i,int j){ if(i==0 || j==0){ return; } if(b[i][j]=='c'){ print_lcs(b,x,i-1,j-1); printf(" %c",x[i-1]); } else if(b[i][j]=='u'){ print_lcs(b,x,i-1,j); } else{ print_lcs(b,x,i,j-1); } }
int calculate_lcs(char *a, char *b) { int lena = strlen(a); int lenb = strlen(b); int **array; int ret; int i, j; ret = allocate_2d_array(&array, lena + 1, lenb + 1); for (i = 0; i < lena; i++) array[i][0] = 0; for (j = 0; j < lenb; j++) array[0][j] = 0; for (i = 1; i < lena + 1; i++) { for (j = 1; j < lenb + 1; j++) { if (a[i - 1] == b[j - 1]) array[i][j] = array[i - 1][j - 1] + 1; else array[i][j] = MAX(array[i][j - 1], array[i - 1][j]); } } ret = array[lena][lenb]; print_lcs1(array, a, b, ret); print_lcs(array, a, b, ret); free_2d_array(array, lena + 1, lenb + 1); return ret; }
void print_lcs (char *s, int *b, int m, int n) { int offset = m+1; int c; if(m == 0 || n == 0) return; c = *(b+m*offset+n); if(c == 0){ print_lcs(s, b, m-1, n-1); printf("%c", *(s+m-1)); } else if(c == 1) print_lcs(s, b, m-1, n); else print_lcs(s, b, m, n-1); }
void lcs_length(char x[],char y[]){ int m,n,i,j,c[20][20]; char b[20][20]; m=strlen(x); n=strlen(y); for(i=0;i<=m;i++){ c[i][0]=0; } for(i=0;i<=n;i++){ c[0][i]=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]='c'; //c stands for left upright cross } else if(c[i-1][j]>=c[i][j-1]){ c[i][j]=c[i-1][j]; b[i][j]='u'; //u stands for upright or above } else{ c[i][j]=c[i][j-1]; b[i][j]='l'; //l stands for left } } } print_lcs(b,x,m,n); }
void print_lcs(int *a, int i, int j) { if (i == 0 || j == 0) return; if (c[i][j].dir == 0) { print_lcs(a, i - 1, j - 1); printf("%d\n", a[i]); } else if (c[i][j].dir == 1) print_lcs(a, i - 1, j); else { print_lcs(a, i, j - 1); } }
void print_lcs(char *a,char *b,int length_a, int length_b, int *count, int *flag,int i, int j){ if (i<0 || j <0){ return; } else{ if (*(flag+i*length_b+j) ==1){ print_lcs(a,b,length_a,length_b,count,flag,i-1,j-1); printf("%c",a[i]); } else if (*(flag+i*length_b+j) ==2){ print_lcs(a,b,length_a,length_b,count,flag,i-1,j); } else{ print_lcs(a,b,length_a,length_b,count,flag,i,j-1); } } }
int main() { int i, j; int lcs[M+1][N+1]; char dir[M+1][N+1]; //char x[M] = {'D', 'B', 'C', 'A', '\0'}; //char y[N] = {'C', 'D', 'B', 'C', 'A', 'D', '\0'}; //char *x = "ABCBDAB"; //char *y = "BDCABA"; char *x = "10010101"; char *y = "010110110"; for(j=0;j<=N;j++) { lcs[0][j] = 0; dir[0][j] = '0'; } for(i=0;i<=M;i++) { lcs[i][0] = 0; dir[i][0] = '0'; } for(i=0;i<M;i++) { for(j=0;j<N;j++) { if(x[i] == y[j]) { lcs[i+1][j+1] = 1 + lcs[i][j]; dir[i+1][j+1] = 'd'; } else if(lcs[i+1][j] > lcs[i][j+1]) { lcs[i+1][j+1] = lcs[i+1][j]; dir[i+1][j+1] = 'l'; } else { lcs[i+1][j+1] = lcs[i][j+1]; dir[i+1][j+1] = 'u'; } } } for(i=0;i<=M;i++) { for(j=0;j<=N;j++) printf("%c ", dir[i][j]); printf("\n"); } printf("Length of longest common subsequence of %s and %s is %d\n", x, y, lcs[M][N]); print_lcs(dir, x, M, N); printf("\n"); return 1; }
int main(int argc, char *argv[]) { double start, end, time; start = omp_get_wtime(); readFile(argc, argv); lcs_length(); print_lcs(); end = omp_get_wtime(); time = end - start; //printf("%f\n", time); return 0; }
int main (int argc, char *argv[]) { int m, n, length; int *b; if(argc < 3) { fprintf(stderr, "not enough parameters\n"); exit(EXIT_FAILURE); } m = strlen(argv[1]); n = strlen(argv[2]); b = (int *)malloc(sizeof(int)*(m+1)*(n+1)); length = lcs_length(argv[1], argv[2], m, n, b); printf("%s\n%s\n", argv[1], argv[2]); printf("lcs length is: %d\n", length); printf("lcs is: "); print_lcs(argv[1], b, m, n); printf("\n"); exit(EXIT_SUCCESS); }
char * lcs(char *a,char *b,int length_a,int length_b){ /* * used for count x[i-1],y[j-1] lcs length * count[1][2] means x[1],y[2] string lcs length */ int count[length_a][length_b]; int flag[length_a][length_b]; count_lcs(a,b,length_a,length_b,(int *)count,(int *)flag); int i=0; int j=0; /*for (i=0; i <length_a;++i){ for(j=0;j<length_b;++j){ printf("%d,",flag[i][j]); } printf("\n"); }*/ print_lcs(a,b,length_a,length_b,(int *)count,(int *)flag,length_a - 1,length_b-1); }
void lcs_length(char *X, char *Y) { int *c; int *b; int m = strlen(X); int n = strlen(Y); c = (int *)malloc(sizeof(int) * m * n); b = (int *)malloc(sizeof(int) * m * n); int i,j; printf(" "); for(j = 0; j < n; j++){ printf("%4c", Y[j]); } printf("\n%c", X[0]); for(i = 0; i < n; i++){ printf("%4d", 0); } printf("\n"); for(i = 1; i < m; i++){ printf("%c%4d", X[i], 0); for(j = 1; j < n; j++){ if(X[i] == Y[j]){ *(c + i*n + j) = *(c + (i-1)*n + (j-1)) + 1; *(b + i*n + j) = 1; }else if(*(c + (i-1)*n + j) >= *(c + i*n + j-1)){ *(c + i*n + j) = *(c + (i-1)*n + j); *(b + i*n + j) = 2; }else{ *(c + i*n + j) = *(c + i*n + j-1); *(b + i*n + j) = 3; } printf(" %d-%d", *(b + i*n + j), *(c + i*n + j)); } printf("\n"); } print_lcs(b, X, i-1, j-1, n); printf("\n"); }