最大公共字串

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
 * 求数组 a 与 b 的最长公共子序列
 * 
 */

#define LEFT_UP 0x1
#define LEFT    0x2
#define UP      0x4

int get_long_common_subsequence(char *a, int al, char*b, int bl, int ***c)
{
    int i = 0;
    int j = 0;
    int row = al > bl ? al:bl;
    int clm = al < bl ? al:bl;
    int **cl = (int**)malloc((row+1)*sizeof(int*));
    *c = cl;
#if 1
    for(i = 0; i < row+1; i++)
    {
        cl[i] = (int*)malloc((clm+1)*sizeof(int));
        for(j = 0; j < clm+1; j++)
        {
            cl[i][j] = 0;
        }
    }
#endif
    /*          
     * c[i,j] save the 'longest-common-subsequence' length a[i] and b[j]
     *
     *          |0                          if i = 0 or j = 0;
     *          |
     * c[i,j] = |c[i-1,j-1]+1               if i,j > 0 and a[i] == b[j]
     *          |
     *          |max(c[i,j-1], c[i-1,j])    if i,j > 0 and a[i] != b[j]
     */
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < clm; j++)
        {
            if(a[i] == b[j])
            {
                cl[i+1][j+1] = cl[i][j] + 1;
            }
            else if(cl[i+1][j] >= cl[i][j+1])
            {
                cl[i+1][j+1] = cl[i+1][j];
            }
            else
            {
                cl[i+1][j+1] = cl[i][j+1];
            }
        }
    }
    printf("\n");
    return 0;
}

void print_lcs(int **c, int m, int n, char *a)
{
    if(m == 0 || n == 0)
        return ;
    if(c[m][n]-1 == c[m-1][n-1])
    {
        print_lcs(c, m-1, n-1, a);
        printf("%c,", a[m-1]);
    }
    /*else if(c[m-1][n-1] == c[m][n])
    {
        print_lcs(c, m-1, n-1, a);
    }*/
    else if(c[m-1][n] == c[m][n])
    {
        print_lcs(c, m-1, n, a);
    }
    else
    {
        print_lcs(c, m, n-1, a);
    }
}


int main(int argc, char* argv[])
{
    char a[] = "abcbdab";
    char b[] = "bdcaba";
    int **c = NULL;
    int m = 7, n = 6;
    get_long_common_subsequence(a, m, b, n, &c);
    print_lcs(c, m, n, a);
    printf("\n");
    int i = 0, j = 0;
#if 0
    for(i = 0; i < m+1; i++)
    {
        for(j = 0; j < n+1; j++)
        {
            printf("c[%d][%d] = %d\n", i, j, c[i][j]);
        }
    }
#endif
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值