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);
} 
京公网安备 11010502036488号