[LeetCode] DP 之 Maximum Length of Repeated Substring

题目

Given two integer arrays A and B, return the maximum length of an subarray that appears in both arrays.

Example 1:

Input:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
Output: 3
Explanation:
The repeated subarray with maximum length is [3, 2, 1].

分析

这题也是dp的方法,一开始我的思路是跟edit distance比较像,就是通过一个二维的矩阵,然后取子串,不断地累加,最后的dp[m][n] 就是最大值。后来发现不行。因为这样就无法记录是不是开始了一个新的子串,在后续的比较中,无法判断是否之前已经重新开了个子串,因此只能退而求其次,将dp[i][j] 的意思变为,对于A.substring[i]和B.substring[j],当前的A[i]和B[j]是当前在计算的重复子串的第几个元素。如果当前的A[i],B[j]不在重复子串中,那么则为0。 最后考虑dp[i][j] 中最大的那个值,就是最长重复子串的长度。注意,每个dp[i][j]都是只依赖于 dp[i-1][j-1]的。

时间复杂度分析

时间复杂度显而易见,为了填充一个二维矩阵,需要消耗O( mn )的时间。空间复杂度也是O( mn )

代码

class Solution {
public:
    int findLength(vector<int>& A, vector<int>& B) {
        int m = A.size(), n = B.size(), maxLength = 0;
        int** dp = new int*[m+1];
        for (int i = 0; i < m + 1; i++) {
            dp[i] = new int[n+1];
            memset(dp[i], 0, sizeof(int)*(n+1));
        }
        for (int i = 1; i < m +1; i++) {
            for (int j = 1; j < n + 1; j++) {
                if (A[i - 1] == B[j - 1]) {
                    dp[i][j] = dp[i - 1][j-1] +1;
                    maxLength = max(dp[i][j], maxLength);
                }
            }
        }

        for (int i = 0; i < m + 1; i++) {
            delete []dp[i];
        }
        delete []dp;
        return maxLength;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34035179/article/details/78447867
今日推荐