dp-最长子序列问题


package dp.longestCommonSubsequence;

/**
 * Created on 2022/1/5.
 *
 * @author
 */

/**
 * 最⻓公共⼦序列(Longest Common Subsequence,
 * 简称 LCS)是⼀道⾮常经 典的⾯试题⽬,因为它的解法是典型的⼆维动态规划,
 * ⼤部分⽐较困难的字 符串问题都和这个问题⼀个套路,⽐如说编辑距离。
 * ⽽且,这个算法稍加改 造就可以⽤于解决其他问题,所以说 LCS 算法是值得掌握的。
 * 题⽬就是让我们求两个字符串的 LCS ⻓度:
 * 输⼊: str1 = "abcde", str2 = "ace"
 * 输出: 3
 * 解释: 最⻓公共⼦序列是 "ace",它的⻓度是 3 肯定有读者会问,
 * 为啥这个问题就是动态规划来解决呢?因为⼦序列类型的 问题,穷举出所有可能的结果都不容易,
 * ⽽动态规划算法做的就是穷举 + 剪枝,它俩天⽣⼀对⼉。所以可以说只要涉及⼦序列问题,
 * ⼗有⼋九都需要 动态规划来解决,往这⽅⾯考虑就对了。
 */
public class longestCommonSubsequence {
    public static int longestCommonSubsequence(String str1, String str2) {
        if (str1 == "" || str2 == "") {
            return 0;
        }

        int[][] dp = new int[str1.length() + 1][str2.length() + 1];
        char[] char1 = str1.toCharArray();
        char[] char2 = str2.toCharArray();
        for (int i = 1; i <= str1.length(); i++) {
            for (int j = 1; j <= str2.length(); j++) {
                if (char1[i - 1] == char2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[str1.length()][str2.length()];
    }

    public static void main(String[] args) {
        String str1 = "abcde";
        String str2 = "ace";
        System.out.println(longestCommonSubsequence(str1, str2));
    }
}

posted @   小傻孩丶儿  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2020-01-05 Lc178-分数排名
2020-01-05 Lc177-第N高的薪水
2020-01-05 Lc7- 整数反转
2020-01-05 Lc5-最长回文子串
2020-01-05 关于学习小组第三篇分享总结-三十天如何让自己变成一个超级自律的人
点击右上角即可分享
微信分享提示