题解 | #查找两个字符串a,b中的最长公共子串#
查找两个字符串a,b中的最长公共子串
http://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506
package nowcoder;
import java.util.Scanner;
/**
* 查找两个字符串a,b中的最长公共子串
* 描述
* 查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
* 注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
*
* 本题含有多组输入数据!
* 数据范围:字符串长度1\le s \le300 \1≤s≤300 ,1\le t\le 5\1≤t≤5
* 进阶:时间复杂度:O(n^3)\O(n
* 3) ,空间复杂度:O(n)\O(n)
* 输入描述:
* 输入两个字符串
*
* 输出描述:
* 返回重复出现的字符
* 示例1
* 输入:
* abcdefghijklmnop
* abcsafjklmnopqrstuvw
* 输出:
* jklmnop
*/
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();
if (s1.length() < s2.length()){
process(s1, s2);
}else{
process(s2, s1);
}
}
}
private static void process(String shortStr, String longStr) {
char[] shortArr = shortStr.toCharArray();
//从短串的最长子串开始暴力遍历
for (int i = shortArr.length - 1; i >= 0; i--) {
//遍历短串的所有长度为i的子串 是否为长串的子串
for (int j = 0; j + i < shortArr.length; j++) {
String subStr = new String(shortArr, j, i);
if (longStr.contains(subStr)){
System.out.println(subStr);
return;
}
}
}
}
}