1.创建dp数组(算法核心是动态规划)
// 创建dp数组
int[][] getDp(char[] arr1,char[] arr2){
int[][] dp = new int[arr1.length][arr2.length];
// 第一列赋值
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] == arr2[0]){
dp[i][0] = 1;
}
}
// 第一行赋值
for (int j = 1; j < arr2.length; j++) {
if (arr2[j] == arr1[0]){
dp[0][j] = 1;
}
}
// 其余位置相等的赋值为 左上角加1 ==》当前子串长度
for (int i = 1; i < arr1.length; i++) {
for (int j = 1; j < arr2.length; j++) {
if (arr1[i] == arr2[j]){
dp[i][j] = dp[i-1][j-1] + 1;
}
}
}
return dp;
}
2.通过调用上面的getDp()方法,寻找最长公共子串的长度
// 寻找最长子串
int find(String str1,String str2){
// 判空
if (str1 == null || str2 == null || str1.equals("") || str2.equals("")){
return -1;
}
// 字符串转字符数组
char[] arr1 = str1.toCharArray();
char[] arr2 = str2.toCharArray();
int[][] dp = getDp(arr1,arr2);
int end = 0;
int maxLength = 0;
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr2.length; j++) {
if (dp[i][j] > maxLength){
// end 即为结束子串的位置下标
end = i;
// 更新maxLength
maxLength = dp[i][j];
}
}
}
String subs = str1.substring(end-maxLength+1, end+1);
System.out.println("两个字符串的最长相同子串:"+subs);
return maxLength;
}
3.测试运行
main()测试
Test test = new Test();
System.out.println(test.find("GCCCTAGCCAGDE", "GCGCCAGTGDE"));
输出:
转载地址:原文地址(有详解)