Description
给出两个字符串,求出两个字符串的公共子串?
sample Input
encodingmy
mydecoding
sample Output
coding
两种方法:
//暴力求解最长公共子串
public static void enumString(char[]s1 ,char[]s2){
int run_Count = 0;//运行次数
int common_length = 0;//长度
String largest_str = "";
for(int i=0;i<s1.length;i++){
for(int j=0;j<s2.length;j++){
int length = 0;
int m = i;
int n = j;
String tem_str = "";//临时子串
while(m<s1.length && n < s2.length){
run_Count ++;
if(s1[m] != s2[n]) break;
tem_str = tem_str + s1[m];
length++;
m++;
n++;
}
if(common_length < length){
common_length = length;
}
if(tem_str.length()>=largest_str.length()){
largest_str = tem_str;
}
}
}
System.out.println("最长公共子串数:"+common_length);
System.out.println("最长公共子串:"+largest_str);
System.out.println("运行次数:"+run_Count);
}
//动态规划方法
public static void dpString(char[]s1 ,char[]s2){
int[][] dp = new int[101][101];
int max = -1;
//初始化数组
for(int i=0;i<dp.length;i++){
dp[0][i] = 1;
dp[i][0] = 1;
}
int x = 0;
int y = 0;
for(int i=1;i<s1.length;i++){
for(int j=1;j<s2.length;j++){
if(s1[i] == s2[j]){
//动态转移方程
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = 0;
}
if(max < dp[i][j]){
max = dp[i][j];
x = i;
y = j;
}
}
}
//输出子串
System.out.print("最长子串:");
for(int i=0,k=max;k>0;k--,i++){
System.out.print(s1[x-max+1+i]);
}
//输出子串长度
System.out.println("\n最长子串长度:"+max);
}
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
//字符串数据读取
String str1 = in.nextLine();
String str2 = in.nextLine();
// str1 = str1.replace(" ", "");
// str2 = str2.replace(" ", "");
// System.out.println(str1);
// System.out.println(str2);
char[]s1 = str1.toCharArray();
char[]s2 = str2.toCharArray();
// enumString(s1,s2);
dpString(s1,s2);
}
结果