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));
    }
}

不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!
原文地址:https://www.cnblogs.com/xiaoshahai/p/15765657.html