题解 | #查找两个字符串a,b中的最长公共子串#

查找两个字符串a,b中的最长公共子串

https://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506

import java.util.*;
// 参考大佬
//遍历字符串的所有可能子串
//每个字母作为一个起点
//每个起点开始的字符串从大到小遍历

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String  s1 = in.nextLine();
            String s2 = in.nextLine();
            if(s1.length() > s2.length()){
               String temp = s1;
               s1 = s2;
               s2 = temp;
            }       
            //s1总是较短串
 
            int max = 0; //当前最长公共子串的长度
            int maxIndex = 0;//较短串中当前最长公共子串的开头节点位置

            //1. 将s1较短的字符串中的每个字符作为起点,通过两个for循环遍历s1中所有可能的子串
            //然后判断这些子串是否存在于s2中。
            //注意:这里遍历顺序是从每个字符作为起点,所可能达到的最长子串开始遍历,从大到小
            for(int i = 0; i < s1.length(); i++){
                //如果以i为起点的最长子串本身 小于 之前的最大公共子串长度,则后面的都不需要再遍历
                if(s1.length() - i <= max){
                    break;
                }

                for(int r = s1.length(); r > i; r--){
                    String subStr = s1.substring(i,r);
                    if(s2.contains(subStr) && subStr.length() > max){
                        max = subStr.length();
                        maxIndex = i;
                        //找到就可以立马返回到i层循环
                        break;
                    }
                }
            }

            System.out.println(s1.substring(maxIndex, maxIndex + max));
        }
    }
}

(1) 修改一些错误:第29行 以i为起点的最长子串 = s1.length -1 -i +1

(2)第二个循环,是需要设一个r变量即可

全部评论
我背下来,可是,考试考的是最短
点赞 回复 分享
发布于 2024-10-21 19:03 江苏

相关推荐

点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务