您的位置:首页 > 职场人生

面试题[动态规划]: 最长公共子序列

2015-03-25 15:19 232 查看
问题:输入两个字符串,返回最长公共子序列。

最长公共子序列问题(Longest Common Subsequence)是经典的动态规划问题,可以通过以下方式来求解较小规模的问题:

在找A和B的公共子序列时:

如果有am-1==bn-1,则进一步解决一个子问题,找“a0,a1,…,am-2”和“b0,b1,…,bm-2”的一个最长公共子序列;

如果am-1!=bn-1,则要解决两个子问题:

找出“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列;

找出“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列;

再取两者中较长者作为A和B的最长公共子序列。

C++代码实现如下:

[code]    string LCS(string str1, string str2) {
        int len1 = str1.size();
        int len2 = str2.size();
        vector<vector<int> > c(len1 + 1, vector<int>(len2 + 1, 0));

        for (int i = 1; i <= len1; ++i)
            for (int j = 1; j <= len2; ++j)
                if (str1[i - 1] == str2[j - 1]) c[i][j] = c[i - 1][j - 1] + 1;
                else c[i][j] = max(c[i - 1][j], c[i][j - 1]);

        int len = c[len1][len2];
        string res(len, 0);
        int i = len1, j = len2;
        while (i && j) {
            if (str1[i - 1] == str2[j - 1]) {
                res[--len] = str1[--i];
                --j;
            }
            else c[i - 1][j] > c[i][j- 1] ? --i : --j;
        }

        return res;
    }


参考链接:/article/1422816.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: