2.求两个字符串的最长公共子串

思路:

使用二维数组保存两个字符串中对应字符的比较结果,如果两个字符相等,而且其左上角没有元素,则比较结果为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());
	}
}

猜你喜欢

转载自blog.csdn.net/qq_38442065/article/details/80490073