美文网首页
c语言解决最长重复子串问题

c语言解决最长重复子串问题

作者: 一路向后 | 来源:发表于2021-05-19 21:05 被阅读0次

1.解题思路

最大后缀方法思路:

  1. 用字符串指针数组保存用户输入的字符串的所有后缀字符串;

  2. 将后缀字符串集合进行排序;

  3. 比较相邻字符串的公共子串长度,找到长度最大值,保存相应字符串即为所求

2.源码实现

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

/*最长重复子串*/

#define MAXCHAR 2048

typedef short (*cmpfun)(char *a, char *b);

/*求出两个字符串的公共子串长度*/
int comlen(char *p, char *q)
{
    int i = 0;

    while(*p && (*p++  == *q++))
    {
        ++i;
    }

    return i;
}

/*求出两个字符串的公共子串*/
int comstr(char *p, char *q, char *c)
{
    int i = 0;

    while(*p && (*p == *q))
    {
        c[i] = *p;
        p++;
        q++;
        i++;
    }

    c[i] = 0x00;

    return i;
}

/*用字符串指针保存所有后缀字符串*/
int initpoint(char *c, char **a)
{
    int i;

    for(i=0; c[i]!=0x00; i++)
    {
        a[i] = &c[i];
    }

    a[i] = NULL;

    return i;
}

void bubsort(char **a, int n, cmpfun f)
{
    char *t;
    int i, j;

    for(i=0; i<n-1; i++)
    {
        for(j=0; j<n-1-i; j++)
        {
            if(f(a[j], a[j+1]) > 0)
            {
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
}

short wecmp(char *a, char *b)
{
    return strcmp(a, b);
}

int main()
{
    char *a[MAXCHAR];
    char c[MAXCHAR];
    char d[MAXCHAR];
    int n;
    int i;
    int temp;
    int maxlen = 0;
    int maxi = 0;

    memset(d, 0x00, sizeof(d));

    scanf("%s", c);

    n = initpoint(c, a);

    /*for(i=0; i<n; i++)
    {
        printf("a[%d]=%s\n", i, a[i]);
    }*/

    /*将后缀字符串集合进行排序*/
    bubsort(a, n, wecmp);

    for(i=0; i<n-1; ++i)
    {
        temp = comlen(a[i], a[i+1]);

        /*printf("temp=%d\n", temp);
        printf("maxlen=%d\n", maxlen);
        printf("i=%d\n", i);
        printf("maxi=%d\n", maxi);*/

        if(temp > maxlen)
        {
            maxlen = temp;
            maxi = i;
        }
    }

    /*for(i=0; i<n; i++)
    {
        printf("a[%d]=%s\n", i, a[i]);
    }*/

    comstr(a[maxi], a[maxi+1], d);

    printf("%d\n", comlen(a[maxi], a[maxi+1]));
    printf("%s\n", d);

    return 0;
}

3.编译源码

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

4.运行及其结果

$ ./example
abcabc
3
abc

相关文章

网友评论

      本文标题:c语言解决最长重复子串问题

      本文链接:https://www.haomeiwen.com/subject/jplmjltx.html