描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
数据范围:字符串长度1\le length \le300 \1≤length≤300
进阶:时间复杂度:O(n^3)\O(n3) ,空间复杂度:O(n)\O(n)
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入:
abcdefghijklmnop abcsafjklmnopqrstuvw复制输出:
jklmnop复制
package org.example.medium;
import java.util.*;
public class Hj65 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s1 = scanner.nextLine();
String s2 = scanner.nextLine();
String[] strings = switchSize(s1, s2);
String max = strings[1];
String min = strings[0];
String result = checkMaxStr(max, min);
System.out.println(result);
}
}
private static String checkMaxStr(String max, String min) {
int maxLen = 0;
//重写compare方法
TreeSet<String> set = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length()>o2.length()){
return 1;
}else if(o1.length()==o2.length()){
return 0;
}else {
return -1;
}
}
});
if (max.contains(min)) {
return min;
}
for (int i = 0; i < min.length() - 1; i++) {
for (int i1 = i+2; i1 < min.length() + 1; i1++) {
String sub = min.substring(i, i1);
if (max.contains(sub)) {
if (sub.length() > maxLen) {
maxLen = sub.length();
set.add(sub);
}
}
}
}
return set.last();
}
public static String[] switchSize(String s1, String s2) {
String[] results = new String[2];
String minStr = null;
String maxStr = null;
if (s1.length() <= s2.length()) {
minStr = s1;
maxStr = s2;
} else {
maxStr = s1;
minStr = s2;
}
results[0] = minStr;
results[1] = maxStr;
return results;
}
}