面試題[動態規劃]: 最長公共子序列

問題:輸入兩個字符串,返回最長公共子序列。

最長公共子序列問題(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

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