动态规划问题——最长公共子串问题

导读:本篇文章讲解 动态规划问题——最长公共子串问题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目:

给定两个字符串 str1 和 str2,返回两个字符串的最长公共子串。

举例:

str1 = “1AB2345CD”    str2 = “12345EF”    返回 “2345”

思路:

str1长度为M,str2长度为N,生成大小为M*N的矩阵dp ,dp[i][j]的含义是,在把str1[i] 和 str2[j] 当作公共子串最后一个字符的情况下,公共子串最长能有多长。

动态规划问题——最长公共子串问题

获取dp矩阵的代码如下:

    public static int[][] getdp1(char[] str1, char[] str2) {
        //初始化dp大小
        int[][] dp = new int[str1.length][str2.length];
        //初始化第一列
        for (int i = 0;i < str1.length; i++) {
            if (str1[i] == str2[0]){
                dp[i][0] = 1;
            } else {
                dp[i][0] = 0;
            }
        }
        //初始化第一行 第一个0位置已经初始化了,所以j从1开始
        for (int j = 1;j < str1.length; j++) {
            if (str1[0] == str2[j]){
                dp[0][j] = 1;
            } else {
                dp[0][j] = 0;
            }
        }
        //初始化其他位置
        for (int i = 1; i < str1.length; i++) {
            for (int j = 1; j < str2.length; j++) {
                if (str1[i] == str2[j]) {
                    dp[i][j] = dp[i-1][j-1] + 1;
                } else {
                    dp[i][j] = 0;
                }
            }
        }
        return dp;
    }

测试结果:

动态规划问题——最长公共子串问题 

通过得到的 dp 矩阵,可以知道 dp[3][4] 为最大值,那么最长公共子串的长度就是3,从 str[3] 开始向左一共 3 个字节的字符串 str[1..3],就是最后要的最长公共字符串。

注意 subString函数,左闭右开

找到最长公共子串代码如下:

    public static String lcst(String str1, String str2) {
        if (str1 == null || str2 == null || str1.equals("") || str2.equals("")) {
            return "";
        }
        char[] chs1 = str1.toCharArray();
        char[] chs2 = str2.toCharArray();
        int[][] dp = getdp1(chs1, chs2);
        int end = 0;
        int max = 0;
        for (int i = 0; i < chs1.length; i++) {
            for (int j = 0; j < chs2.length; j++) {
                if (dp[i][j] > max) {
                    end = i;
                    max = dp[i][j];
                }
            }
        }
        return str1.substring(end - max + 1, end + 1);
    }

测试结果:

动态规划问题——最长公共子串问题

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/87952.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!