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

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

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

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        /**
        1.dp[i][j]  s1 中以i结尾  s2以j结尾的 最长公共子串长度
        2.递推公式
            如果 s1[i] == s2[j]
                那么 dp[i][j]=dp[i-1][j-1]+1;
            如果不等那么直接为0
        3.遍历顺序
            左上到右下
        4.初始化 
            设置数组多一行一列
        5.举例推导
         */
        while (in.hasNext()) { // 注意 while 处理多个 case
            String s1=in.next();
            String s2=in.next();
            //使s1是短的那个
            if(s1.length()>s2.length()){
                String temp=s1;
                s1=s2;
                s2=temp;
            }
            int max=0;
            int idx=0;
            int[][] dp=new int[s1.length()+1][s2.length()+1];

            for(int i=0;i<s1.length();i++){
                for(int j=0;j<s2.length();j++){
                    if(s1.charAt(i)==s2.charAt(j)){
                        dp[i+1][j+1]=dp[i][j]+1;
                        if(dp[i+1][j+1]>max){
                            max=dp[i+1][j+1];
                            idx=i;
                        }
                    }
                }
            }

            System.out.println(s1.substring(idx-max+1,idx+1));

        }
    }
}

全部评论

相关推荐

头像
05-13 11:19
C++
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务