题解 | #查找两个字符串a,b中的最长公共子串#
查找两个字符串a,b中的最长公共子串
https://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506
import java.util.*;
// 参考大佬
//遍历字符串的所有可能子串
//每个字母作为一个起点
//每个起点开始的字符串从大到小遍历
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String s1 = in.nextLine();
String s2 = in.nextLine();
if(s1.length() > s2.length()){
String temp = s1;
s1 = s2;
s2 = temp;
}
//s1总是较短串
int max = 0; //当前最长公共子串的长度
int maxIndex = 0;//较短串中当前最长公共子串的开头节点位置
//1. 将s1较短的字符串中的每个字符作为起点,通过两个for循环遍历s1中所有可能的子串
//然后判断这些子串是否存在于s2中。
//注意:这里遍历顺序是从每个字符作为起点,所可能达到的最长子串开始遍历,从大到小
for(int i = 0; i < s1.length(); i++){
//如果以i为起点的最长子串本身 小于 之前的最大公共子串长度,则后面的都不需要再遍历
if(s1.length() - i <= max){
break;
}
for(int r = s1.length(); r > i; r--){
String subStr = s1.substring(i,r);
if(s2.contains(subStr) && subStr.length() > max){
max = subStr.length();
maxIndex = i;
//找到就可以立马返回到i层循环
break;
}
}
}
System.out.println(s1.substring(maxIndex, maxIndex + max));
}
}
}
(1) 修改一些错误:第29行 以i为起点的最长子串 = s1.length -1 -i +1
(2)第二个循环,是需要设一个r变量即可
查看4道真题和解析