最长公共子串(Longest Common Substring)和最长公共子序列(Longest Common Subsequence)
参考文章:https://blog.csdn.net/u013309870/article/details/69479488
最长公共子串(Longest Common Substring)
/**
* 要求:求两个字符串的最长公共子串,如text1="12345abc",text2="2d3e45fabc",则二者的最长公共子串为"abc"
* @param text1 字符串1,String类型
* @param text2 字符串2,String类型
* @return 公共字串,String类型;稍加修改就能返回长度
* 方法:动态规划,填表,text1为纵轴,text2为横轴,dp[i][j]表示text1的前i个字符和text2的前j个字符的最大公共子串长度
* 计算dp[i][j] 的步骤如下:
* ①矩阵dp的第一列 dp[0…m-1][0].对于 某个位置(i,0)如果text1[i]==text2[0],则dp[i][0]=1,否则dp[i][0]=0
* ②矩阵 dp 的第一行 dp[0][0…n-1].对于 某个位置(0,j)如果text1[0]==text2[j],则dp[0][j]=1,否则dp[0][j]=0
* ③其他位置从左到右从上到下计算,dp[i][j]的值只有两种情况:
* 1). text1[i]==text2[j],dp[i][j]=dp[i-1][j-1]+1;
* 2). text1[i]!=text2[j]则dp[i][j]=0;
* 这里dp[i][j]表示以j(i也一样)下标对应的字符为公共子串结尾的子串的长度,如果不是子串结尾即text1[i]!=text2[j],则dp[i][j]=0
*/
public static String longestCommonSubString(String text1, String text2) {
if (text1 == null || text2 == null || text1.length() == 0 || text2.length() == 0) {
return "";
}
// 动态规划数组dp,行数为text1的长度,列数为text2的长度
int[][] dp = new int[text1.length()][text2.length()];
// 字串的最大长度
int max = 0;
// 记录公共子串最后一个字符在text1中的位置
int index = -1;
// 初始化dp的首