华为机试题65-查找两个字符串a,b中的最长公共子串

描述

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。

注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!

数据范围:字符串长度1≤length≤300

进阶:时间复杂度:O(n^3) ,空间复杂度:O(n)

输入描述:

输入两个字符串

输出描述:

返回重复出现的字符

示例1

输入:

abcdefghijklmnop
abcsafjklmnopqrstuvw

输出:

jklmnop


解题思路:

这道题直接暴力求解了。

首先把短字符串和长字符串进行了区分,这有利于后面解题

由于要找最长的公共子串,所以我从最长的子串长度开始遍历查找,即短字符串的长度,如若短字符串与长字符串的所有子串并不相同,则将子串长度减1,遍历短字符串和长字符串在这个长度下的子串,如果相同就可以break,这个就是最先出现的最长公共子串。如果这个长度下仍然没有公共子串,则将子串长度再减1,继续查找。

代码如下:

#include <stdio.h>
#include <string.h>
#define    N    300
int main()
{
    char str1[N],str2[N],son1[N],son2[N];
    scanf("%s%s",str1,str2);
    int len1=strlen(str1),len2=strlen(str2),i=0,j,k,t,u,flag=0;
    if(len1>len2)            //统一str1是短字符串,str2是长字符串
    {
        strcpy(son1,str1);
        strcpy(str1,str2);
        strcpy(str2,son1);
        j=len1;len1=len2;len2=j;
    }
    while(len1-i>0)            //从最长子串的长度开始查找
    {
        for(j=0;j<=i;j++)     //短串中子串开始的位置
        {
            t=0;
            for(k=j;k<j+len1-i;k++)
            {
                son1[t++]=str1[k];
            }
            son1[t]='\0';
            for(k=0;k<=i+len2-len1;k++)    //长串中子串开始的位置
            {
                t=0;
                for(u=k;u<k+len1-i;u++)
                {
                    son2[t++]=str2[u];
                }
                son2[t]='\0';
                if(!strcmp(son1,son2))    //出现相同子串
                {
                    flag=1;
                    break;
                }
            }
            if(flag)
                break;
        }
        if(flag)
            break;
        i++;
    }
    printf("%s\n",son1);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值