动态规划,类似的字符处理题有很多,可以结合起来一起做

注意的点是根据字符串长度分类讨论

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

char str1[301];
char str2[301];
char res[301] = {0};
int dp[301][301] = {0};
int main()
{
    //gets(str1);
    //gets(str1);
    scanf("%s",str1);
    scanf("%s",str2);
    int m = strlen(str1);
    int n = strlen(str2);
    int max = 0;
    int start = 0;

    if(m < n)
    {
        for (int i = 1; i <= m; i++) {
            char c1 = str1[i - 1];
            for (int j = 1; j <= n; j++) {
                char c2 = str2[j - 1];
                if (c1 == c2) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                if(dp[i][j] > max)
                {
                    max = dp[i][j];
                    start = i - max;
                }
            }
        }
        for(int i=start; i < start+max; i++)
        {
            printf("%c", str1[i]);
        }
        printf("\n");
    }
    else
    {
        for (int i = 1; i <= n; i++) {
            char c1 = str2[i - 1];
            for (int j = 1; j <= m; j++) {
                char c2 = str1[j - 1];
                if (c1 == c2) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                if(dp[i][j] > max)
                {
                    max = dp[i][j];
                    start = i - max;
                }
            }
        }
        for(int i=start; i < start+max; i++)
        {
            printf("%c", str2[i]);
        }
        printf("\n");
    }
    return 0;
}