首页 > 【牛客题霸每日一题】NC127 最长公共子串 C++ 题解
头像
BNDSBilly
编辑于 2020-12-17 12:21
+ 关注

【牛客题霸每日一题】NC127 最长公共子串 C++ 题解


简单DP,tag[i][j] 表示截止到 s1 的 i 位置和 s2 的 j 位置的最长公共子串长度。由于子串连续,最后找到最大值位置向前递推即可。代码如下:
class Solution {
public:
    /**
     * longest common substring
     * @param str1 string字符串 the string
     * @param str2 string字符串 the string
     * @return string字符串
     */
    string LCS(string s1, string s2) {
        // write code here
        int m = s1.size();
        int n = s2.size();
        int len = 0;
        string ret = "";
        int x, y;
        vector<vector<int>>tag(m + 1, vector<int>(n + 1, 0));
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (s1[i - 1] == s2[j - 1]) {
                    tag[i][j] = tag[i - 1][j - 1] + 1;
                    if (len < tag[i][j]) {
                        len = tag[i][j];
                        x = i, y = j;
                    }
                }
                else
                    tag[i][j] = 0;
            }
        }
        if (len == 0)ret = "-1";
        else {
            for (int i = len; i >= 1; --i) {
                ret += s1[x - i];
            }
        }
        return ret;
    }
};




全部评论

(0) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

近期精华帖

热门推荐