题解 | #查找两个字符串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;
                }
            }
        }
    }
}

全部评论

相关推荐

jack_miller:杜:你不用我那你就用我的美赞臣
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务