题解 | #公共子串计算#

公共子串计算

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

动态规划求解:最长公共子串

  1. 区分最长公共子串/子序列 (百度)

  2. str1 与 str2 某个字符相同时,要找到没有它们参与时前面的最优解dp[i-1][j-1]

    此时再 + 1 得到dp[i][j] = dp[i-1][j-1] + 1; alt

import java.util.Scanner;

/**
 *  最长公共子串
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            // TODO  1. 输入2个字符串
            String str1 = sc.next();
            String str2 = sc.next();

            // TODO  2. 转换为字符数组
            char[] c1 = str1.toCharArray();
            char[] c2 = str2.toCharArray();

            // TODO 3. 构建dp数组
            int[][] dp = new int[c1.length + 1][c2.length + 1];

            // TODO 4. 处理边界问题和初始值
            for (int i = 0; i <= c1.length; i++) {
                dp[i][0] = 0;
            }
            for (int j = 0; j <= c2.length; j++) {
                dp[0][j] = 0;
            }
            int res = 0;  // 定义一个结果来保存最长子串
            // TODO 5. 填充数组其余值
            for (int i = 1; i <= c1.length; i++) {
                for (int j = 1; j <= c2.length; j++) {
                    // TODO 6. 逐一对比每个字符
                    if (c1[i-1] == c2[j-1]){ //因为 c1.c2 是从0开始存字符的
                        // TODO 7. 相等则用不包含该字符的上一个最优解去 + 1
                        dp[i][j] = dp[i-1][j-1] +1;
                       
                    }else {
                        dp[i][j] = 0;
                    }
                     res = Math.max(res,dp[i][j]);
                }
            }
            System.out.println(res);

        }

    }
}
全部评论
哎···动态规划问题真的是··容易思维定势·我一开始一直试图把表格里为0的地方填上最大字串长度····
4 回复 分享
发布于 2022-07-17 15:47
你这个图写的太好了,豁然开朗
2 回复 分享
发布于 2023-03-26 00:04 湖南
dp数组初始化就是0,所以你那个处理边界问题的代码可以去掉。
1 回复 分享
发布于 2022-08-09 11:43
空间复杂度是不是n2了
点赞 回复 分享
发布于 2022-11-07 00:19 浙江
学院派的实战经典例题
点赞 回复 分享
发布于 01-23 22:43 湖南
dp[i][j]的含义是啥?字符相同时i表示行,j表示列?
点赞 回复 分享
发布于 07-15 22:25 广东
需要把二维数组压缩成一维数组,才满足题目要求空间为O(n)
点赞 回复 分享
发布于 09-14 11:19 广东

相关推荐

10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
Bug压路:老哥看得出来你是想多展示一些项目,但好像一般最多两个就够了😂页数一般一页,多的也就2页;这些项目应该是比较同质化的,和评论区其他大佬一样,我也觉得应该展示一些最拿手的(质量>数量)😁😁😁专业技能部分也可以稍微精简一些
点赞 评论 收藏
分享
36 4 评论
分享
牛客网
牛客企业服务