题解 | 查找两个字符串a,b中的最长公共子串

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

/*一维动态规划,定义一个数组dp[shortlen][2],[i][0],代表短字符串中最后出现目标字符串(即最长公共子串)的位置,[i][1],代表目标字符串(即最长公共子串)的长度,i从0一直遍历到shortlen,时间复杂度为O(2*M)*/
int main() {
    char str1[301];
    char str2[301];
    char *pshort,*plong,tempchar;
    int i,j,shortlen,dstlen;

    scanf("%s",str1);
    scanf("%s",str2);

    pshort=str1;
    plong=str2;
    if(strlen(str1)>strlen(str2))
    {
        pshort=str2;
        plong=str1;
    }   
    shortlen=strlen(pshort);
    int dp[shortlen][2];                /*[i][0],代表短字符串中最后出现目标字符串(即最长公共子串)的位置,[i][1],代表目标字符串(即最长公共子串)的长度*/

    if(strchr(plong,pshort[0]))
    {
        dp[0][0]=0;
        dp[0][1]=1;
    }
    else {
        dp[0][1]=dp[0][0]=0;
    }

    for(i=1;i<shortlen;i++)
    {
        if((dp[i-1][0]+dp[i-1][1])==i)
        {
            tempchar = pshort[i+1];
            pshort[i+1]='\0';
            if(strstr(plong,pshort+dp[i-1][0]))
            {
                dp[i][0]=dp[i-1][0];
                dp[i][1]=dp[i-1][1]+1;
            }
            else 
            {
                dp[i][0]=dp[i-1][0];
                dp[i][1]=dp[i-1][1];
            }
            pshort[i+1]=tempchar;
        }
        else 
        {   
            tempchar = pshort[i+1];
            pshort[i+1]='\0';
            //if(strstr(plong,pshort+i-dp[i-1][0]+1))
            if(strstr(plong,pshort+i-dp[i-1][1]+1))  //更新目标字符串的位置
            {
                dp[i][0]=i-dp[i-1][1]+1;
                dp[i][1]=dp[i-1][1];
            }
            else 
            {
                dp[i][0]=dp[i-1][0];
                dp[i][1]=dp[i-1][1];
            }
            pshort[i+1]=tempchar;        
        }
    }

    dstlen=dp[shortlen-1][1];
    for(i=0;i<shortlen;i++)
    {
        tempchar = pshort[i+dstlen];
        pshort[i+dstlen]='\0';
        if(strstr(plong,pshort+i))
        {
            printf("%s",pshort+i);
            return 0;
        }
        pshort[i+dstlen]=tempchar;
    }

    return 0;
}

全部评论

相关推荐

01-22 11:12
郑州大学 Java
点赞 评论 收藏
分享
2024-12-16 21:59
东北大学 Java
水杉1:我评估了仨月了
点赞 评论 收藏
分享
2024-11-28 22:27
已编辑
西南交通大学 Java
Kensley:交大的学弟,整体挺好的 稍微有点乱可以考虑做减法了 并发和java可以合一起,知识上补充一下Redis集群技术的死角,主从,Sentinel,Cluster。 大计基改成课程就行:《计算机网络》《操作系统原理》《数据结构》《算法》。 最重要的,项目还要再挖掘,要用【问题/场景】驱动开发,效果放在最后一句就行,“基于XXX/集成XXX实现XXX功能,【解决XXX问题】,效果XXX”,比如基于Redis实现商品信息的读缓存,解决了浏览高峰时因高频访问MySQL偶发卡顿的问题,体感性能上升30% 排版相关的:1. 大段文本要做提炼,比如“XXX等有基本的了解”改为“了解XXX”,文本相关都可以喂给GPT看看精简效果;2.黑体粗有点多,长文本和奖项的加粗去掉,奖项的时间不用列;3. 项目和实习的时间挪到后面,保持一致
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务