题解 | #最长公共子序列-II#

最长公共子序列-II

http://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11

class Solution {
private:
    string build(string& str, int i, int j, vector<vector<int>>& directions){
        if(i < 1 || j < 1){
            return "";
        }
        string ans;
        if(directions[i][j] == 1){
            // 来自左上方
            ans += build(str, i - 1, j - 1, directions);
            ans += str[i-1];
        }else if(directions[i][j] == 2){
            // 来自左侧
            ans = build(str, i, j - 1, directions);
        }else if(directions[i][j] == 3){
            // 来自右侧
            ans = build(str, i-1, j, directions);
        }
        return ans;
    }
public:
    string LCS(string s1, string s2) {
        // write code here
        int size1 = s1.size(), size2 = s2.size(), len = 0;
        vector<vector<int>> dp(size1+1, vector<int>(size2+1, 0)), directions(size1+1, vector<int>(size2+1, 0));
        for(int i = 1; i < size1 + 1; ++i){
            char e1 = s1[i-1];
            for(int j = 1; j < size2 + 1; ++j){
                char e2 = s2[j-1];
                // 左上方
                if(e1 == e2){
                    dp[i][j] = dp[i-1][j-1] + 1;
                    directions[i][j] = 1;
                }else if(dp[i-1][j] < dp[i][j-1]){
                    dp[i][j] = dp[i][j-1];
                    // 左侧
                    directions[i][j] = 2;
                }else{
                    dp[i][j] = dp[i-1][j];
                    // 上方
                    directions[i][j] = 3;
                }
                len = max(len, dp[i][j]);
            }
        }
        if(!len){
            return "-1";
        }
        // 构造最长公共子序列
        return build(s1, size1, size2, directions);
    }
};
全部评论

相关推荐

07-07 14:30
复旦大学 Java
遇到这种人我也不知道说啥了
无能的丈夫:但我觉得这个hr语气没什么问题啊(没有恶意
点赞 评论 收藏
分享
06-28 22:48
已编辑
广东金融学院 Java
小浪_Coding:学院本+这俩项目不是buff叠满了嘛
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务