题解 | #最长公共子串#

最长公共子串

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

#include <vector>
class Solution {
public:
    /**
     * longest common substring
     * @param str1 string字符串 the string
     * @param str2 string字符串 the string
     * @return string字符串
     */
    string LCS(string str1, string str2) {
        vector<vector<int>> dp = get_dp(str1, str2);
        int end = 0;
        int max = 0;
        for (int i = 0; i < str1.length(); ++i) {
            for (int j = 0; j < str2.length(); ++j) {
                if (dp[i][j] > max) {
                    end = i;
                    max = dp[i][j];
                }
            }
        }
        // cout << max << ", " << end << endl;
        // 从最长公共子串的下标处截取,截取长度是max
        string result = str1.substr(end - max + 1, max);
        // cout << "result == " <<  result << endl;
        return result;
    }
    
    vector<vector<int>> get_dp(string& s1, string& s2) {
        int len1 = s1.length();
        int len2 = s2.length();
        vector<vector<int>> dp(len1, vector<int>(len2));

        // 初始化行:dp[i][0]
        for (int i = 0; i < len1; ++i) {
            dp[i][0] = s1[i] == s2[0] ? 1 : 0;
        }
        // 初始化列:dp[0][j]
        for (int j = 0; j < len2; ++j) {
            dp[0][j] = s1[0] == s2[j] ? 1 : 0;
        }

        for (int i = 1; i < len1; ++i) {
            for (int j = 1; j < len2; ++j) {
                if (s1[i] == s2[j]) {
                    dp[i][j] = dp[i-1][j-1] + 1;
                } else {
                    dp[i][j] = 0;
                }
            }
        }
        return dp;
    }
};

2023-剑指-DP 文章被收录于专栏

2023-剑指-DP

全部评论

相关推荐

点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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