zoukankan      html  css  js  c++  java
  • 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));
        }
    }
    
    
    不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!
  • 相关阅读:
    Excelファイルを扱う方法
    BINARYSEARCH有り無しのパフォーマンスの違い
    権限チェック
    ラジオボタンで選択項目を動的に変更
    ALVのイベントを取得する方法
    LOOP AT SCREEN
    MOVE-PERCENTAGE(文字列の部分の代入)
    Java快捷键与搜狗输入法快键的冲突
    Android之RadioButton多行
    Android之socket服务端
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/15765657.html
Copyright © 2011-2022 走看看