列表

详情


KS31. 最大公共子串

描述

给定两个字符串,请编写代码,输出最长公共子串(Longest Common Substring),是指两个字符串中的最长的公共子串,要求子串一定是连续。

数据范围:输入的两个字符串长度满足

输入描述

文本格式,2个非空字符串(字母数字组成),2个字符串以","英文逗号分割。

输出描述

整形,为匹配到的最长子串长度

示例1

输入:

bab,caba

输出:

2

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 328KB, 提交时间: 2020-05-20

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
  
  
  
int main() 
{
    char str1[100];
    char str2[100];
    int res[100][100]={0};
  
    scanf("%[^,],%s", str1, str2);
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    int m_len = 0;
    for (int i = 0; i < len1; i++) 
    {
        for (int j = 0; j < len2; j++) 
        {
            if (str1[i] == str2[j]) 
            {
                if (i == 0 || j == 0)
                    res[i][j] = 1;
                else
                    res[i][j] = res[i - 1][j - 1] + 1;
            }
            m_len = m_len>res[i][j]? m_len:res[i][j];
        }
    }
      
    printf("%d ", m_len);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 396KB, 提交时间: 2021-08-23

#include<stdio.h>
#include<string.h>
int main()
{
    char a[1000],b[1000],c;
    int i=0,j,sum=0,max=0,i_,j_;
    /*input*/
    while ((c=getchar())!=',')
    {
        a[i++]=c;
    }
    gets(b);
    for(i=0;i<strlen(a);i++)
    {
        for(j=0;j<strlen(b);j++)
        {
            sum=0;
            if(a[i]==b[j])
            {
                i_=i;
                j_=j;
                while (a[i_]==b[j_])
                {
                    i_++;
                    j_++;
                    sum++;
                }
                if(sum>max) max=sum;
            }
        }
    }
    printf("%d\n",max);
    return 0;
}

上一题