最长相同子字符串(LCS)

动态规划
https://kanarien.cn/2019/02/12/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%9A%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%BA%8F%E5%88%97%E5%92%8C%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E4%B8%B2/
https://labuladong.gitbook.io/algo/dong-tai-gui-hua-xi-lie/bei-bao-wen-ti
class Solution {
public String longestCommonString(String s1, String s1) {
int len1 = s1.length();
int len2 = s2.length();
int left = 0;
int max_len = 0;
// 动态规划
int dp[][] = new int[len1+1][len2+1];
// dp[i][j] 表示在s1[i]==s2[j] 时,s1[1~i]和s2[1~j]的LCS
for(int i = 0; i<= len1; i++) {
for(int j = 0; j<=len2; j++) {
if(i == 0 || j == 0) {
dp[i][j] = 0;
} else if(s1.charAt(i-1) == s2.charAt(j-1)) {
dp[i][j] = dp[i-1][j-1] + 1;
max_len = Math.max(max_len, dp[i][j]);
if(max_len == dp[i][j]) {
left = i-max_len;
}
} else {
dp[i][j] = 0;
}
}
}
return s1.substring(left, left+max_len);
}
}