Java机试题:查找两个字符串a,b中的最长公共子串

描述

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;


public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()) {
            String str1 = sc.nextLine();
            String str2 = sc.nextLine();
            String minStr = str1;
            String maxStr = str2;
            if(minStr.length() > maxStr.length()) {
                minStr = str2;
                maxStr = str1;
            }
            // 找出str1的所有子串
            List<String> allSunStr = new ArrayList<String>();
            for (int i = 0; i < minStr.length(); i++) {
                for (int j = i + 1; j <= minStr.length(); j++) {
                    allSunStr.add(minStr.substring(i, j));
                }
            }
            // 排序将大的子串排在前面
            Collections.sort(allSunStr, new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    return o2.length() - o1.length();
                }
            });
            // 已经按最大到最小排序后就不用判断是否是最大子串,第一次匹配到的就是最大公共子串
            for (int i = 0; i < allSunStr.size(); i++) {
                if(maxStr.indexOf(allSunStr.get(i))> -1) {
                    System.out.println(allSunStr.get(i));
                    break;
                }
            }
        }
    }
}

 题目来源:牛客网

posted @ 2022-01-11 09:36  对月当歌  阅读(533)  评论(0)    收藏  举报