题目描述:
给出n对字符串,找到每对字符串中最大公共子串。
输入格式:
2 //表示有2组
fsjdfgjs //第一组
fdfg
jfdslkdfj //第二组
fjdkdfs
输出格式:
3
3
题目理解起来很简单,但是要用最优解的方式解题,还是很复杂的,恐怕一看到找公共子串就会想到KMP算法。我在《IT名企算法与数据结构题目最优解》中看到解法的时间复杂度为O(M*N),额外空间复杂度为O(1)的方法。
但是由于在线编程的时间有限,我实现的方法很简单,就是1、找到较短的字符串,然后从中依次取子串,这个依次取子串有点讲究,要先取最长的然后慢慢减短,这使得如果找到就是最长的公共子串;2、将子串依次与较长的字符串比较,如果包含则为最长公共子串
代码如下:
扫描二维码关注公众号,回复:
131878 查看本文章
import java.util.Scanner; public class SecondQuestion { public static void main(String[] args) { Scanner in = new Scanner(System.in); String number = in.nextLine(); int num = Integer.parseInt(number); String[] str = new String[num*2]; for(int i=0; i<num*2; i++){ str[i] = in.nextLine(); str[++i] = in.nextLine(); } String[] arr = new String[num]; int j =0; for(int i=0; i<num*2; i++){ arr[j] = Max(str[i], str[++i]); if(arr[j] == null){ System.out.println(0); }else{ System.out.println(arr[j].length()); } j++; } } // 两个字符串中最大的公共子串 public static String Max(String s1, String s2) { String max = (s1.length() > s2.length()) ? s1 : s2; String min = max.equals(s1) ? s2 : s1; for (int i = 0; i < min.length(); i++) { for (int m=0,n=min.length()-i ; n!=min.length()+1; m++, n++) { String sub = min.substring(m, n); if (max.contains(sub)) { return sub; } } } return null; } }
结果截图: