列表

详情


HJ65. 查找两个字符串a,b中的最长公共子串

描述

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!

数据范围:字符串长度
进阶:时间复杂度:,空间复杂度:

输入描述

输入两个字符串

输出描述

返回重复出现的字符

示例1

输入:

abcdefghijklmnop
abcsafjklmnopqrstuvw

输出:

jklmnop

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 276KB, 提交时间: 2020-11-27

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

void calc(char *a, char *b)
{
    int x=strlen(a), m=0, index=0;
    char res[1000]={0};
    for(int i=0;i<x;i++)
    {
        for(int j=1;i+j<=x;j++)
        {
            if(j<=m)
            {
                continue;
            }
            
            char tmp[1000]={0};
            memcpy(tmp, &a[i], j);
            if(NULL!=strstr(b, tmp))
            {
                m=j;
                memcpy(res, tmp, j);
            }
            else
            {
                break;
            }
        }
    }
    printf("%s\n", res);
}


int main()
{
    char a[1000], b[1000];
    while(scanf("%s", a)!=EOF)
    {
        scanf("%s", b);
        if(strlen(a)>strlen(b))
        {
            calc(b, a);
        }
        else
        {
            calc(a, b);
        }
    }
}

C 解法, 执行用时: 1ms, 内存消耗: 308KB, 提交时间: 2021-04-02

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

void fun(char c1[100],char c2[100])
{
    int i,pos=0,num,max=0,t,w;
    int len1=strlen(c1);
    int len2=strlen(c2);
    if(len1<=len2)
    {
         for(t=0;t<len1;t++)
    {
        
        for(w=0;w<len2;w++)
        {
            num=0;
            i=0;
            while(c1[t+i]==c2[w+i])
            {
                num++;
                i++;
            }
            
            if(max<num)
            {
                max=num;
                pos=t;                             
            }
        }
    }    
         for(i=0;i<max;i++)
    {
        printf("%c",c1[pos+i]);       
    }
    }
    else
    {
      for(t=0;t<len2;t++)
      {
        
          for(w=0;w<len1;w++)
          {
              num=0;
               i=0;
            while(c2[t+i]==c1[w+i])
            {
                num++;
                i++;
            }
            
            if(max<num)
            {
                max=num;
                pos=t;                             
            }
        }
      }    
       for(i=0;i<max;i++)
       {
        printf("%c",c2[pos+i]);       
    }
    }
   
   
     printf("\n");
}

int main()
{
    char c1[1000],c2[1000];
    while(scanf("%s\n%s",c1,c2)!=EOF)
    {
        fun(c1,c2);
    }
    return 0;
}

上一题