vlambda博客
学习文章列表

如果不要求连续求最长公共子序列

若不要求连续子序列,则不仅包括连续的情况存在的可能长度,还包括不连续形成的子序列可能的长度

解题思路:

  • 找匹配的连续子数组可以暴力一点的方法逐个比对元素值

  • 记录连续长度使用动态规划的思想,若当前A中第i个元素和B中第j个元素相同,则在原来数组中比dp[i-1][j-1]值加一,因为dp[i][j]下标对应元素相同即dp[i][j]=dp[i-1][j-1]+1,若不相同dp[i][j]=max(dp[i-1][j], dp[i][j-1])应当是这前两者中最长子序列长度值,自然这个连续子数组长度要加一

  • 另设一个计数器,不断记录所有产生的连续子数组长度的最大值

C/C++题解:

class Solution {

public:

    int findLength(vector<int>& A, vector<int>& B) {

        //两者有一个是空数组,都没有公共子数组

        vector<vector<int>> dp(A.size()+1,vector<int>(B.size()+1,0));

        //dp[i][j]表示A中前i个元素和B中前j个元素最长公共子数组的长度

        int result = 0;

        //dp[0][0]=0,初始,第i个元素相等就记录在数组下标i上

        for (int i = 1; i <= A.size(); i++) {//双循环逐个匹配

            for (int j = 1; j <= B.size(); j++) {

                if (A[i-1] == B[j-1]) {//开始从两数组第一个元素开始

                    dp[i][j] = dp[i-1][j-1]+1;//元素相同长度加一

               else dp[i][j] = max(dp[i-1][j], dp[i][j-1])

                //记录一个最长的数

                result = max(result, dp[i][j]); }}}

        return result;}};

Java题解:

class Solution {

    public int findLength(int[] A, int[] B) {

        //两者有一个是空数组,都没有公共子数组

        int[][] dp = new int[A.length+1][B.length+1];

        //dp[i][j]表示A中前i个元素和B中前j个元素最长公共子数组的长度

        int result = 0;

        //dp[0][0]=0,初始,第i个元素相等就记录在数组下标i上

        for (int i = 1; i <= A.length; i++) {//双循环逐个匹配

            for (int j = 1; j <= B.length; j++) {

                if (A[i-1] == B[j-1]) {//开始从两数组第一个元素开始

                    dp[i][j] = dp[i-1][j-1]+1;//元素相同长度加一

                else dp[i][j] = max(dp[i-1][j], dp[i][j-1])

                //记录一个最长的数

                result = max(result, dp[i][j]); }}}

        return result;}}


Python题解:

class Solution(object):

    def findLength(self, A, B):

        """:type A: List[int]:type B: List[int]

        :rtype: int"""

        #两者有一个是空数组,都没有公共子数组

        dp = [[0 for _ in range(len(B)+1)] for _ in range(len(A)+1)]

        #dp[i][j]表示A中前i个元素和B中前j个元素最长公共子数组的长度

        result = 0

        #dp[0][0]=0,初始,第i个元素相等就记录在数组下标i上

        for i in range(1,len(A)+1): #双循环逐个匹配

            for j in range(1len(B)+1):

                if A[i-1] == B[j-1]: #开始从两数组第一个元素开始

                    dp[i][j] = dp[i-1][j-1]+1 #元素相同长度加一

                    #记录一个最长的数

                    result = max(result, dp[i][j])

        return result

例题来自力扣网https://leetcode-cn.com/

欢迎评论后台留言交流~