2022-10-06 【我的刷题日记】1143最长公共子序列

思路:本题与上一题的唯一不同点在于本题的子序列是可以不连续的,而上一题的子序列必须是连续的,我们在上一题的推导过程中只对两边nums1[i-1]和nums2[j-1]的情况进行推导,因为在连续约束下如果当前判断的值不相同,自然也不存在连续相同的子序列,而本题不同没有必须连续的要求,也就是在nums1[i-1]和nums2[j-1]不相同的情况下,也依然可能存在相同的子序列,在这种情况下的dp[i][j]就要继承上一位的值,上一位的值有两种情况dp[i-1][j]和dp[i][j-1],继承其中最大的即可

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int res = 0;
        int[][] dp = new int[text1.length() + 1][text2.length() + 1];
//        从连续变成了不连续
        for (int i = 1; i < text1.length() + 1 ; i++) {
            for (int j = 1; j < text2.length() + 1;j++){
                if (text1.charAt(i - 1) == text2.charAt( 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]);
                }
                res = Math.max(res,dp[i][j]);
            }

        }
        return res;

    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容