题解 | 最长公共子序列(二)

最长公共子序列(二)

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

class Solution {
public:
    /*
     增加path记录dp选择时的路径,最后按图索骥就能找到这个序列
     */
    string LCS(string s1, string s2) {
        vector<vector<int>>d(s1.size()+1,vector<int>(s2.size()+1,0));
        vector<vector<int>>path(s1.size()+1,vector<int>(s2.size()+1,0));

        for(int i=1;i<=s1.size();++i)
        {
            for(int j=1;j<=s2.size();++j)
            {
                if(s1[i-1]==s2[j-1])
                {
                    d[i][j]=d[i-1][j-1]+1;
                    path[i][j]=1;
                }
                
                else
                {
                    if(d[i-1][j]>d[i][j-1])//来自上方
                    {
                        d[i][j]=d[i-1][j];
                        path[i][j]=2;
                    }
                    else 
                    {
                        //来自左方,相等也包含在内
                        d[i][j]=d[i][j-1];
                        path[i][j]=3;
                    }
                }
            }
        }


        int i=s1.size(),j=s2.size();
        string res="";
        //从后往前,前插逆序
        while(i>0 && j>0)
        {
            if(path[i][j]==1)
            {
                res=s1[i-1]+res;
                i--;
                j--;
            }
            else if(path[i][j]==2)i--;
            else if(path[i][j]==3)j--;
        }
        if(res=="")return "-1";
        else return res;
    }
};

全部评论

相关推荐

卡bg这么严,不是92真是太难了
投递芯原微电子(上海)股份有限公司等公司10个岗位
点赞 评论 收藏
分享
08-08 14:46
郑州大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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