题解 | #最长公共子串#

最长公共子串

https://www.nowcoder.com/practice/f33f5adc55f444baa0e0ca87ad8a6aac

动规:只要将当前的子序列最大长度记录在dp数组中即可,若是两者不相等,那么此时dp数组对应的值为零
class Solution {
public:
    /**
     * longest common subsequence
     * @param s1 string字符串 the string
     * @param s2 string字符串 the string
     * @return string字符串
     */
    string LCS(string s1, string s2) {
        // write code here
        //最长的公共子序列,初始化序列
        vector<vector<int> > dp(s1.size() + 1, vector<int>(s2.size() + 1,0));
        int res = 0;
        int pos = 0;
        for(int i = 1; i <= s1.size() ; i++)
        {
            for(int j = 1; j <= s2.size(); j++)
            {
                if(s1[i - 1] == s2[j - 1])
                {
                    //怎么会呢,就差在后面的一个+1上面,只要确定斜对角是相等的即可
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    //这里面就需要对维护的最大值进行更新,以保障得到的用户一直处于最后的位子
                    if(res <= dp[i][j])
                    {
                        res = dp[i][j];
                        pos = i;//代表最后终止的地方
                    }
                }
                //不相等的话直接置零即可
                else{
                    dp[i][j] = 0;
                }
            }
        }
        
        string r;
        //截取当前子序列的值,然后处理即可
        r.assign(s1.begin() + pos - res , s1.begin() + pos);
        std::cout << r << " res = " << res << " pos = " << pos << std::endl;
        if(r.size() == 0) return "-1";
        return r;
    }
};


全部评论

相关推荐

当初高考报计算机真是造大孽了啊!卷的飞起!哪都是计算机的人,考研,考公,找工作全他奶的计算机的人,太难了。国企也是。关键一届比一届卷,造大孽了!
_Lyrics_:因为计算机,没有体验到快乐的大学研究生时光,好不容易修完课程就要出去实习,看着别人专业可以一起搓麻将,游山玩水,而我却要自己一个人住在北上不到十平米的出租屋,每天两点一线
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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