题目描述
有两个字符串(可能包含空格),请找出其中最长的公共连续子串,输出其长度。
输入描述:
给定两行字符串 长度在1000以内
输出描述:
输出这两个字符串的最长公共连续子串的长度
示例1
输入
复制
abcde bcd
输出
复制
3
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String A=sc.nextLine();
String B=sc.nextLine();
System.out.println(getLenStr(A,A.length(),B,B.length()));
}
/*
* i=0||j=0,dp[i][j]=0;
* A[i]=B[j],dp[i][j]=dp[i-1][j-1]+1
* A[i]!=B[j],dp[i][j]=max(dp[i-1][j],dp[i][j-1])
*/
public static int getLenStr(String A,int m,String B,int n){
int[][] dp=new int[m+1][n+1];
for(int i=0;i<=m;i++){
dp[i][0]=0;
}
for(int i=0;i<=n;i++){
dp[0][i]=0;
}
int max=Integer.MIN_VALUE;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(A.charAt(i-1)==B.charAt(j-1)){
dp[i][j]=dp[i-1][j-1]+1;
if(dp[i][j]>max){
max=dp[i][j];
}
}else{
dp[i][j]=0;
}
}
}
return max;
}
}
题目描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。
输入描述:
输入包括两行,第一行代表字符串srr1,第二行代表字符串str2。\left( 1\leq length(str1),length(str2) \leq 5000 \right)(1≤length(str1),length(str2)≤5000)
输出描述:
输出包括一行,代表最长公共子串。
示例1
输入
复制
1AB2345CD 12345EF
输出
复制
2345
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String A=sc.nextLine();
String B=sc.nextLine();
System.out.println(getLenStr(A,A.length(),B,B.length()));
}
/*
* i=0||j=0,dp[i][j]=0;
* A[i]=B[j],dp[i][j]=dp[i-1][j-1]+1
* A[i]!=B[j],dp[i][j]=max(dp[i-1][j],dp[i][j-1])
*/
public static String getLenStr(String A,int m,String B,int n){
if(m==0||n==0||A==null||B==null){
return "-1";
}
int[][] dp=new int[m+1][n+1];
for(int i=0;i<=m;i++){
dp[i][0]=0;
}
for(int i=0;i<=n;i++){
dp[0][i]=0;
}
int max=Integer.MIN_VALUE;
int index=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(A.charAt(i-1)==B.charAt(j-1)){
dp[i][j]=dp[i-1][j-1]+1;
if(dp[i][j]>max){
max=dp[i][j];
index=i-1;
}
}else{
dp[i][j]=0;
}
}
}
if(max==0){
return "-1";
}else{
int startIndex = index-max+1;
return A.substring(startIndex,index+1);
}
}
}