题解 | #公共子串计算#

公共子串计算

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 浙江
学院派的实战经典例题
点赞 回复 分享
发布于 2024-01-23 22:43 湖南
dp[i][j]的含义是啥?字符相同时i表示行,j表示列?
点赞 回复 分享
发布于 2024-07-15 22:25 广东
需要把二维数组压缩成一维数组,才满足题目要求空间为O(n)
点赞 回复 分享
发布于 2024-09-14 11:19 广东

相关推荐

点赞 评论 收藏
分享
目前感觉简历还有很多问题,希望各位能不吝赐教以及非常感谢这位老哥——@黑皮白袜臭脚体育生&nbsp;的项目,学完一遍感觉受益颇丰
小菜鸡只想转正:校友,我的建议是冗余的最好去掉,突出重点,比如985,211双一流的提示,专业技能调整到个人项目之后的位置。专业技能感觉写的太细了?占用篇幅最好腾出一点给项目经历,如果没写手机号和邮箱,记得加上。
点赞 评论 收藏
分享
评论
37
4
分享

创作者周榜

更多
牛客网
牛客企业服务