最长公共子串问题是寻找两个或多个已知字符串最长的子串。此问题与最长公共子序列问题的区别在于子序列不必是连续的,而子串却必须是。
public class A {
private static int getCommonStrLength(String str1, String str2) {
//创建一个二维数组大小,行列为str1.length()+1,str2.length()
//这一步主要是为了生成网格数组
int len1 = str1.length();
int len2 = str2.length();
int[][] dp = new int[len1 + 1][len2 + 1];
//核心/填充网格数组
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
//如果两个字符相等,那么就获取dp[i - 1][j - 1]该位置的网格的值且加一
if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
//说明不相等
dp[i][j] = 0;
}
}
}
//找到最大值和下标
int max = 0;
int max_y = 0;
for (int i = 0; i <= len1; i++) {
for (int j = 0; j <= len2; j++) {
if (dp[i][j] > max) {
max = dp[i][j];
max_y = j;
}
}
}
System.out.println(str2.substring(max_y - max, max_y ));
return max;
}
public static void main(String[] args) {
System.out.println(getCommonStrLength("1234", "123456"));
}
}