方法一:暴力
方法二:动态规划
公共的、长度最长的子数组,其实就是找到两个数组中相同的连续的数字。
怎么找相同的数字呢?创建下图的表格,相同的记做 1 ,不同的记做 0 (初始值)。
那么如何找最长的连续数字呢,通过观察表格,我们可以看出,能够构成从 左上角 到 右下角 的连线,那么就说明这些数字是连续的。
那么如何找到最大连续的数字呢?可以使用累加,如果该位置是两个数组的值是相等的,那么该位置的值就是其 左上角格子(二维数组)的值 +1,然后找到整个表格中最大的数字就是 相同 连续的数字。
所以,我们可以使用一个二维数组来存放格子中的值。
class Solution {public:int findLength(vector<int>& A, vector<int>& B) {int aLength = A.size();int bLength = B.size();int ans = 0;vector<vector<int>> dp(aLength + 1, vector<int>(bLength + 1, 0));for(int i = 1; i <= aLength ; i ++ ){for(int j = 1; j <= bLength; j++){if(A[i - 1] == B[j - 1]){dp[i][j] = dp[i - 1][j - 1] + 1;}ans = max(dp[i][j], ans);}}return ans;}};
