思路:
使用二维数组保存两个字符串中对应字符的比较结果,如果两个字符相等,而且其左上角没有元素,则比较结果为1,否则为0;
如果两个字符相等,而且其左上角的元素不为0,则比较结果为左上角结果加1。
a b c b 0 1 0 c 0 0 2 a 1 0 0 b 0 2 0 c 0 0 3
实现:
a. 首先定义一个方法,用于返回最大公共子串:
public static String max_Sub(String string,String string2) {
if(string==null || string2==null) {
return null;
}
int col = string.length();//二维数据的列数
int row = string2.length();//二维数组的行数
int flag[][] = new int[col][row];
int endIndex = 0;//最长子串所在字符串的结束位置的索引
int max_length = 0;
for(int i=0;i<col;i++) {
for(int j=0;j<row;j++) {
if(i==0 || j==0) {
flag[i][j]=(string.charAt(i)==string2.charAt(j)? 1 : 0);
}else {
flag[i][j]=(string.charAt(i)==string2.charAt(j)? flag[i-1][j-1]+1 : 0);
}
if(flag[i][j]>max_length) {//若存在两个及以上相同长度的最大公共子串,则输出前面一个
max_length=flag[i][j];
endIndex=i;
}
}
}
return string.substring(endIndex-max_length+1, endIndex+1);
}
b. 在main方法中调用方法打印输出结果:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str1 = scanner.next();
String str2 = scanner.next();
// System.out.println(str1.substring(0, 2));//测试str1的截取子字符串
// System.out.println(str1.substring(0, 4));
scanner.close();
System.out.println("最长公共子串是:"+max_Sub(str1,str2));
System.out.println("长度为:"+max_Sub(str1, str2).length());
}
c. 完整代码如下:
import java.util.Scanner;
public class Max_SubOfTwoString {
public static String max_Sub(String string,String string2) {
if(string==null || string2==null) {
return null;
}
int col = string.length();
int row = string2.length();
int flag[][] = new int[col][row];
int endIndex = 0;
int max_length = 0;
for(int i=0;i<col;i++) {
for(int j=0;j<row;j++) {
if(i==0 || j==0) {//为第一行或者第一列时,因为左上角不存在元素,所以使用if分支语句
flag[i][j]=(string.charAt(i)==string2.charAt(j)? 1 : 0);
}else {
flag[i][j]=(string.charAt(i)==string2.charAt(j)? flag[i-1][j-1]+1 : 0);
}
if(flag[i][j]>max_length) {//若存在两个及以上相同长度的最大公共子串,则输出前面一个
max_length=flag[i][j];
endIndex=i;
}
}
}
return string.substring(endIndex-max_length+1, endIndex+1);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str1 = scanner.next();
String str2 = scanner.next();
// System.out.println(str1.substring(0, 2));//测试str1的截取子字符串
// System.out.println(str1.substring(0, 4));
scanner.close();
System.out.println("最长公共子串是:"+max_Sub(str1,str2));
System.out.println("长度为:"+max_Sub(str1, str2).length());
}
}