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;
}
Beispiel #2
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);
}
Beispiel #4
0
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);
	}
}
Beispiel #5
0
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);
}
Beispiel #7
0
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);
}
Beispiel #8
0
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);
	}
}
Beispiel #9
0
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;
}
Beispiel #11
0
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);
}
Beispiel #13
0
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);
		
	
}
Beispiel #14
0
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");
}