华为机试-查找两个字符串a,b中的最长公共子串(HJ65)-纯C

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

http://www.nowcoder.com/questionTerminal/181a1a71c7574266ad07f9739f791506

纯C

啊,我终于真正学会了动态规划

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

#define MAX 1500

int main()
{
    int dp[MAX][MAX] = {0};
    char str1[MAX] = {'\0'}, str2[MAX] = {'\0'};
    while(gets(str1))
    {
        gets(str2);
        int len1=strlen(str1), len2=strlen(str2);
        //str1保存短字符串
        if(len1 > len2)
        {
            char temp[MAX] = {'\0'};
            strcpy(temp, str1);
            strcpy(str1, str2);
            strcpy(str2, temp);
            len1 += len2;
            len2 = len1 - len2;
            len1 = len1 - len2;
        }
        //maxlen记录最长公共字串长度,index记录第一个最长字串的最后一个字符位置
        int maxlen=0, index;
        for(int i=0; i<len1; i++)
        {
            for(int j=0; j<len2; j++)
            {
                if(str1[i] == str2[j])
                {
                    dp[i+1][j+1] = dp[i][j] + 1;
                    if(maxlen < dp[i+1][j+1])
                    {
                        maxlen = dp[i+1][j+1];
                        index = i;
                    }
                }
                else
                {
                    dp[i+1][j+1] = 0;
                }
            }
        }
        char out[MAX] = {'\0'};
        strncpy(out, &str1[index-maxlen+1], maxlen);
        printf("%s\n", out);
    }
    return 0;
}
全部评论
else { dp[i+1][j+1] = 0; } 这个好像不用加,两个字符不等的话,dp[i+1][j+1]=dp[i][j]
点赞 回复 分享
发布于 2021-07-12 15:14
请教下,两个for循环,并为啥要创建二维数组,搞不懂动态规划
点赞 回复 分享
发布于 2022-03-15 11:17

相关推荐

头像
11-09 17:30
门头沟学院 Java
TYUT太摆金星:我也是,好几个华为的社招找我了
点赞 评论 收藏
分享
点赞 6 评论
分享
牛客网
牛客企业服务