题解 | #最长公共子串#

最长公共子串

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


全部评论

相关推荐

Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
05-09 14:45
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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