#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) {
        int n1 = str1.length(), n2 = str2.length();
        int maxl = 0, maxstart = 0;
        vector<vector<int> > dp(n1 + 1, vector<int>(n2 + 1));
        for (int i = 1; i <= n1; ++i) {
            for (int j = 1; j <= n2; ++j) {
                if (str1[i - 1] == str2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    if (dp[i][j] > maxl) {
                        maxstart = i - dp[i][j];
                        maxl = dp[i][j];
                    }
                } else {
                    dp[i][j] = 0;
                }
            }
        }
        return str1.substr(maxstart, maxl);
    }
};

思路:在求最长公共子串长度的基础上,记录一个最大长度。如果最大长度发生了更新,则更新对应长度以及此时的起始位置。

最后通过起始位置与长度,用substr方法找到最长字串。