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

问题:输入两个字符串,返回最长公共子序列。

最长公共子序列问题(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++代码实现如下:

    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;
    }

参考链接:http://blog.csdn.net/hackbuteer1/article/details/6686925

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章