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

题目描述:

给出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;
		}
}

结果截图:


猜你喜欢

转载自blog.csdn.net/smile_yangyue/article/details/79714097