题解 | 公共子串计算

公共子串计算

https://www.nowcoder.com/practice/98dc82c094e043ccb7e0570e5342dd1b

import java.util.*;
import java.lang.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String sb1 = in.nextLine();
            String sb2 = in.nextLine();
            String longSb,shortSb;
            if(sb1.length()<sb2.length()) {
                longSb = sb2;
                shortSb = sb1;
            }else{
                longSb = sb1;
                shortSb = sb2;
            }
            int maxLen = 0;
            int[][] dp = new int[shortSb.length()][longSb.length()];
            for(int i=0;i<shortSb.length();i++) dp[i][0] = shortSb.substring(i,i+1).equals(longSb.substring(0,1))? 1:0;
            for(int i=0;i<longSb.length();i++) dp[0][i] = longSb.substring(i,i+1).equals(shortSb.substring(0,1))? 1:0;
            for(int i=1;i<shortSb.length();i++){
                for(int j=1;j<longSb.length();j++){
                    dp[i][j] = shortSb.substring(i,i+1).equals(longSb.substring(j,j+1))? 1+dp[i-1][j-1]:0;
                }
            }
            for(int i=0;i<shortSb.length();i++)
                for(int j=0;j<longSb.length();j++)
                    maxLen = Math.max(maxLen,dp[i][j]);
            System.out.println(maxLen);
        }
    }
}

dp,设定dp[i][j]代表两个数组分别以i/j结尾,并且s1[i]==s2[j]的情况下的最长公共子串长度。

为什么要这么设计呢? 因为:我们想要找到状态转移方程,那么必须得要尾巴可以续上的,比如axa和waxa,最长公共子串是axa,在第一个a的时候最长是1,在x的时候可以续上前面的a,在第二个a的时候又可以续上前面的x,这就构成了“可继承上一个计算结果”的特点,符合dp的特性

全部评论

相关推荐

02-01 12:05
复旦大学 Java
腾讯的提前批大概率应该是没有笔试的,但是这个时候有相当部分的同学简历估计都没有准备好,没准备好的同学也不用急,大部分都是3月之后开,这个时候开的绝大多数都是神仙打架,问的东西也比较难,打算投递的同学也多看下计算机网络和操作系统,腾讯对这部分的知识问的比较多。另外多刷下牛客的热门题库,刷题注意刷ACM模式,和牛客的周赛题,腾讯有的部门会从这里面出原题。我是@程序员花海关注我,带你了解更多校招资讯!
程序员花海:还没有来得及准备的同学可以看下学习路线:https://www.nowcoder.com/discuss/824693499982315520?sourceSSR=users算法题:https://www.nowcoder.com/feed/main/detail/20e7a999fa04485b88340a274411ca0d?sourceSSR=users八股文:https://www.nowcoder.com/discuss/833102362771251200?sourceSSR=users简历书写方式:https://www.nowcoder.com/discuss/839907820706205696?sourceSSR=users都是以前在牛客发的文章~
AI求职实录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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