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