127 最长公共子串(牛客题霸 )

方法一:动态规划(此题画出动态变化表更易理解)

原理:类似于力扣:1143. 最长公共子序列
时间复杂度O(n * m) n 为A长度,m为B长度
空间复杂度O(n * m)

逻辑

图片说明

public static String LCS (String str1, String str2) {
    // write code here
    int dp[][] = new int[str1.length() + 1][str2.length() + 1];
    for (int i = 0; i < dp.length; i++) dp[i][0] = 0;
    for (int i = 0; i < dp[0].length; i++) dp[0][i] = 0;
    int maxLen = 0;    //记录最大长度
    int end = 0;    //字符串截取的末尾后一位
    for (int i = 1; i <= str1.length(); i++) {
        for (int j = 1; j <= str2.length(); j++) {
            if (str1.charAt(i - 1) == str2.charAt(j - 1)) dp[i][j] = dp[i - 1][j - 1] + 1;
            else dp[i][j] = 0;
            if (maxLen < dp[i][j]) {
                maxLen = dp[i][j];
                end = j;    //将末尾后一位保存下来
            }
        }
    }
    if (maxLen == 0) return "-1";
        //substring 是左闭右开的
    else return str2.substring(end - maxLen, end);
}