代码请进行一定修改后使用,本代码保证100%通过率。
本题提供了java、c++、python、JsNode四种代码。复盘思路在文章的最后
题目描述
小明负责维护项目下的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码。
重复代码查找方法:以字符串形式给定两行代码(字符串长度 1 < length <= 100,由英文字母、数字和空格组成),找出两行代码中的最长公共子串。
注:如果不存在公共子串,返回空字符串
输入描述
输入的参数text1, text2分别表示两行代码
输出描述
输出任一最长公共子串
示例1
输入
hello123world
hello123abc4输出
hello123
示例2
输入
rghello123wohellord66665rld
vfhello123abc4hellord66665输出
hellord6666
java代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
String a=cin.next();
String b=cin.next();
int n=a.length();
int m=b.length();
for(int i=100;i>=0;i--){
for(int j=0;;j++){
if(j+i>n)
break;
String tmp=a.substring(j,j+i);
if(b.contains(tmp)) {
System.out.println(tmp);
i=-1;
break;
}
}
if(i==0)
System.out.println("");
}
}
}
python代码:
a=input()
b=input()
n=len(a)
i=100
while(i>=0):
j=0
while(1):
if(j+i>n):
break
tmp=a[j:j+i]
if(b.find(tmp)!=-1):
print(tmp)
i=-1
break
j+=1
if(i==0):
print("")
i-=1
c++代码:
#include <bits/stdc++.h>
using namespace std;
string a,b;
int main()
{
cin>>a>>b;
int n=a.size();
for(int i=100;i>=0;i--){
for(int j=0;;j++){
if(j+i>n)
break;
string tmp=a.substr(j,i);
if(b.find(tmp)<b.size()){
cout<<tmp<<endl;
i=-1;
break;
}
}
if(i==0)
cout<<""<<endl;
}
return 0;
}
JsNode代码:
let cin = require('readline')
const RL = cin.createInterface({
input: process.stdin,
output: process.stdout
})
let T = 1
let str=""
RL.on('line', line => {
str=line.split(' ')
if(T==1){
a=str[0]
}else{
b=str[0]
let n=a.length;
let m=b.length;
for(let i=100;i>=0;i--){
for(let j=0;;j++){
if(j+i>n)
break;
tmp=a.slice(j,i+j);
if(b.indexOf(tmp)!=-1) {
console.log(tmp)
i=-1;
break;
}
}
if(i==0)
console.log("")
}
}
T++
})
复盘思路:
枚举判断即可
因为两个字符串的长度都<100,那么直接枚举a长度为 i 的截取字符串,再在b中查看是否有这个字串
有的话可以直接输出该截取的字符串,因为长度是从大到小(100-0)来枚举的,break跳出循环
如果i等于0了,都没有匹配到,那么输出空字符串
时间复杂度O(n的平方)