题目描述:
给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。
输入描述:
输入包括两行,第一行代表字符串srr1,第二行代表字符串str2。
输出描述:
输出包括一行,代表最长公共子串。
示例1
输入
1AB2345CD
12345EF
输出
2345
解法一:动态规划
思路: 还是难在确定如何抽象
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s1 = br.readLine().trim();
String s2 = br.readLine().trim();
String res = findCommon(s1,s2);
System.out.println(res);
}
public static String findCommon(String s1,String s2){
if(s1==null&&s2==null) return "-1";
if(s1==null||s2==null) return "-1";
if(s1.length()==0||s2.length()==0) return "-1";
char[] arr1 = s1.toCharArray();
char[] arr2 = s2.toCharArray();
int[][] dp = getdp(arr1,arr2);
int index = 0;
int max = 0;
for(int i=0;i<arr1.length;i++){
for(int j=0;j<arr2.length;j++){
if(dp[i][j]>max){
max = dp[i][j];
index = i;
}
}
}
if(max==0) return "-1";
return s1.substring(index-max+1,index+1);
}
public static int[][] getdp(char[] arr1,char[] arr2){
int[][] dp = new int[arr1.length][arr2.length];
for(int i=0;i<arr1.length;i++){
dp[i][0] = arr1[i]==arr2[0]?1:0;
}
for(int i=0;i<arr2.length;i++){
dp[0][i] = arr1[0]==arr2[i]?1:0;
}
for(int i=1;i<arr1.length;i++){
for(int j=1;j<arr2.length;j++){
dp[i][j] = arr1[i]==arr2[j]?dp[i-1][j-1]+1:0;
}
}
return dp;
}
}
解法二:优化空间
思路: 因为只用了对角线的上一个
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s1 = br.readLine().trim();
String s2 = br.readLine().trim();
String res = findCommon(s1,s2);
System.out.println(res);
}
public static String findCommon(String s1,String s2){
if(s1==null&&s2==null) return "-1";
if(s1==null||s2==null) return "-1";
if(s1.length()==0||s2.length()==0) return "-1";
char[] arr1 = s1.toCharArray();
char[] arr2 = s2.toCharArray();
//int[][] dp = getdp(arr1,arr2);
int index = 0;
int max = 0;
for(int i=0;i<arr1.length;i++){
int x = i,y = 0;
int tmp = 0;
while(x<arr1.length&&y<arr2.length){
if(y==0){
tmp = arr1[x]==arr2[0]?1:0;
}else{
tmp = arr1[x]==arr2[y]?tmp+1:0;
}
if(tmp>max){
max = tmp;
index = x;
}
x++;
y++;
}
}
for(int i=0;i<arr2.length;i++){
int y = i,x = 0;
int tmp = 0;
while(x<arr1.length&&y<arr2.length){
if(x==0){
tmp = arr2[y]==arr1[0]?1:0;
}else{
tmp = arr1[x]==arr2[y]?tmp+1:0;
}
if(tmp>max){
max = tmp;
index = x;
}
x++;
y++;
}
}
if(max==0) return "-1";
return s1.substring(index-max+1,index+1);
}
}