牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度。
输入描述:
输入为两行字符串(可能包含空格),长度均小于等于50.
输出描述:
输出为一个整数,表示最长公共连续子串的长度。
输入例子:
abcde abgde
输出例子:
2
该题是动态规划中很典型的一种题型
package substring.largest.the;
import java.util.Scanner;
/*
* 两个字符串str1和str2,长度分别为a,b
* 建立状态转移矩阵a*b,先初始化第一行和第一列
* arr[i][j]=1+arr[i-1][j-1]
*/
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str1=sc.nextLine();
String str2=sc.nextLine();
int result=solve(str1,str2);
System.out.println(result);
}
private static int solve(String str1, String str2) {
int a=str1.length();
int b=str2.length();
char[] arr1=str1.toCharArray();
char[] arr2=str2.toCharArray();
int[][] martix=new int[a][b];
//初始化matrix的第一行和第一列
for(int i=0;i<a;i++){
if(arr1[i]==arr2[0])
martix[i][0]=1;
}
for(int i=0;i<b;i++){
if(arr1[0]==arr2[i])
martix[0][i]=1;
}
//生成状态转移矩阵
for(int i=1;i<a;i++){
for(int j=1;j<b;j++){
if(arr1[i]==arr2[j])
martix[i][j]=martix[i-1][j-1]+1;
}
}
//返回martix数组中最大值
int max=0;
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
if(martix[i][j]>max)
max=martix[i][j];
}
}
return max;
}
}