当前位置: 主页 > JAVA语言

最长公共子序列java-用动态规划法最长公共子序列

发布时间:2023-05-18 09:21   浏览次数:次   作者:佚名

1. dp 数组的定义

下标: 以 i - 1 和 j - 1 为结尾的子序列

值:以 i - 1 和 j - 1 为结尾的最长公共子序列的长度

2. 递推公式

用动态规划法最长公共子序列_最长公共子序列java_最长公共子序列java

if(text1[i - 1] == text2[j - 1])     // 相等        
    dp[i][j] = dp[i - 1][j - 1] + 1 ;
else
    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); 

不相等分为两种情况

用动态规划法最长公共子序列_最长公共子序列java_最长公共子序列java

i - 1 之后,再与当前的 j 比较

例如:abcd abe,此时的 c 和 e 不相等,所以就向前比较,ab 与 abe

最长公共子序列java_用动态规划法最长公共子序列_最长公共子序列java

|i| |j|

j - 1 之后最长公共子序列java,再与当前的 i 比较

最长公共子序列java_用动态规划法最长公共子序列_最长公共子序列java

例如:abcd abe,此时的 c 和 e 不相等,所以就向前比较,abc 与 ab

3. 初始化,因为是从 dp数组的定义是从 i - 1 和 j - 1 进行比较的最长公共子序列java,所以可以默认初始化

最长公共子序列java_最长公共子序列java_用动态规划法最长公共子序列

用动态规划法最长公共子序列_最长公共子序列java_最长公共子序列java

4. 遍历顺序

从小到大

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        vector> dp(text1.size()+ 1, vector(text2.size() + 1, 0));
        int res = 0;
        for(int i = 1 ; i <= text1.size() ; i++)  // 这里是 <= 
        {
            for(int j = 1 ; j <= text2.size(); j++) // 这里是 <= 
            {
                if(text1[i - 1] == text2[j - 1])                
                    dp[i][j] = dp[i - 1][j - 1] + 1 ;
                else
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); 
            }   
        }
        return dp[text1.size()][text2.size()];
    }
};