c语言求最长公共子串长度

2021-04-04  本文已影响0人  一路向后

1.解题思路

   将两个字符串组成二维数组,相同的值为1,不同的值为0,同时在对角线上叠加,矩阵中的最大值则为最长公共子串长度.

2.源码实现

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

int func(char *a, int n, char *b, int m)
{
    int **c = (int **)malloc(n*sizeof(int *));
    int s = 0;
    int t = -1;
    int i, j;

    for(i=0; i<n; i++)
    {
        c[i] = (int *)malloc(m*sizeof(int));
    }

    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            if(a[i] == b[j])
            {
                c[i][j] = 1;

                if(i && j)
                {
                    c[i][j] += c[i-1][j-1];
                }
            }
            else
            {
                c[i][j] = 0;
            }
        }
    }

    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            if(c[i][j] > s)
            {
                s = c[i][j];
                t = i;
            }
        }
    }

    for(i=0; i<n; i++)
    {
        free(c[i]);
        c[i] = NULL;
    }

    free(c);
    c = NULL;

    return s;
}

int main()
{
    char a[1024];
    char b[1024];
    int m;
    int n;
    int z;

    scanf("%s", a);
    scanf("%s", b);

    n = strlen(a);
    m = strlen(b);

    if(n >= m)
    {
        z = func(a, n, b, m);
    }
    else
    {
        z = func(b, m, a, n);
    }

    printf("%d\n", z);

    return 0;
}

########3.编译源码

$ gcc -o example examle.c -std=c89

4.运行及其结果

$ ./example
hello
dwedohell 
4
上一篇下一篇

猜你喜欢

热点阅读