题目描述
小明负责维护项目下的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码。重复代码查找方法:以字符串形式给出两行代码(字符审长度1< length < 100,由英文字母、数字和空格组成),找出两行代码中的最长公共子串 注:如果不存在公共子串,返回空字符串
输入
输入的参数 text1,text2 分别表示两行代码
输出
输出任一最长公共子串
样例输入 复制
hello123world1
hello123abc4
样例输出 复制
hello123
思路:
用动态规划解这个题就很简单,只要考虑当前位置对应的元素是否相同,相同就调用前置结果+1,否则就直接赋值为0。
最后遍历整个二维数组,找到最大的元素,依据当前位置进行向前遍历,拼接字符串即可得到所要的结果。
代码:
import java.util.Scanner;
/**
* 小明负责维护项目下的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码。
* 重复代码查找方法:以字符串形式给出两行代码(字符审长度1< length < 100,由英文字母、数字和空格组成),
* 找出两行代码中的最长公共子串 注:如果不存在公共子串,返回空字符串
*/
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String s1 = scanner.nextLine();
String s2 = scanner.nextLine();
int[][] nums=new int[s1.length()+1][s2.length()+1];
int MaxI=0;
int MaxL=0;
for(int i=1;i<s1.length()+1;i++){
for(int j=1;j<s2.length()+1;j++){
if(s1.charAt(i-1)==s2.charAt(j-1)){
nums[i][j]=nums[i-1][j-1]+1;
}else{
nums[i][j]=nums[i][j];
}
if(nums[i][j]>MaxL){
MaxL=nums[i][j];
MaxI=i-1;
}
}
}
StringBuilder result= new StringBuilder();
if(MaxL==0){
System.out.println(result);
return;
}
while (MaxL>0){
result.insert(0, s1.charAt(MaxI));
MaxI--;
MaxL--;
}
System.out.println(result);
}
}