微信扫一扫

028-83195727 , 15928970361
business@forhy.com

[置顶] 算法面试题(二)-- 最长公共子序列(LCS)与苦恼的月下老人

算法面试,动态规划,最长公共子串2016-06-22

这是一个典型的动态规划题,属于求两个字符串的最长公共子串问题,如果你手边有《算法导论》这本书,这个问题就可以在书中找到;

Code:

int LCS(const char *Male,const char *Female)
    {
        int N = (int)strlen(Male);
        int M = (int)strlen(Female);
        int pair[1001][1001];//配对结果矩阵
        //初始化
        for (int i = 0; i < N; i ++)
        {
            pair[i][0] = 0;
        }
        for (int i = 0; i < M; i ++)
        {
            pair[0][i] = 0;
        }
        
        for (int i = 1; i <= N; i ++)
        {
            for (int j = 1; j <= M; j ++)
            {
                if (Male[i-1] == Female[j-1])
                    pair[i][j] = pair[i-1][j-1] + 1;
                else
                {
                    if (pair[i-1][j] > pair[i][j-1])
                        pair[i][j] = pair[i-1][j];
                    else
                        pair[i][j]=pair[i][j-1];
                }
            }
        }
        
        return pair[N][M];
    }


int  main()
{
    const char Male[1001];
    const char Female[1001];
    scanf("%s\r\n%s",Male,Female);
    printf("%d",LCS(Male,Female));
    return 0;
}

result: