您的位置:首页 > 其它

【华为2018年校招笔试】找两个字符串的最大公共子串

2018-03-27 15:58 573 查看
题目描述:
给出n对字符串,找到每对字符串中最大公共子串。
输入格式:
 2                                  //表示有2组
 fsjdfgjs                          //第一组
 fdfg  
 jfdslkdfj                        //第二组

 fjdkdfs  
输出格式:
3
3
题目理解起来很简单,但是要用最优解的方式解题,还是很复杂的,恐怕一看到找公共子串就会想到KMP算法。我在《IT名企算法与数据结构题目最优解》中看到解法的时间复杂度为O(M*N),额外空间复杂度为O(1)的方法。
但是由于在线编程的时间有限,我实现的方法很简单,就是1、找到较短的字符串,然后从中依次取子串,这个依次取子串有点讲究,要先取最长的然后慢慢减短,这使得如果找到就是最长的公共子串;2、将子串依次与较长的字符串比较,如果包含则为最长公共子串
代码如下: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;
}
}结果截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: