image.png

方法一:暴力

方法二:动态规划

公共的、长度最长的子数组,其实就是找到两个数组中相同连续的数字。

怎么找相同的数字呢?创建下图的表格,相同的记做 1 ,不同的记做 0 (初始值)。

那么如何找最长的连续数字呢,通过观察表格,我们可以看出,能够构成从 左上角 到 右下角 的连线,那么就说明这些数字是连续的。

那么如何找到最大连续的数字呢?可以使用累加,如果该位置是两个数组的值是相等的,那么该位置的值就是其 左上角格子(二维数组)的值 +1,然后找到整个表格中最大的数字就是 相同 连续的数字。

所以,我们可以使用一个二维数组来存放格子中的值。
image.png

  1. class Solution {
  2. public:
  3. int findLength(vector<int>& A, vector<int>& B) {
  4. int aLength = A.size();
  5. int bLength = B.size();
  6. int ans = 0;
  7. vector<vector<int>> dp(aLength + 1, vector<int>(bLength + 1, 0));
  8. for(int i = 1; i <= aLength ; i ++ ){
  9. for(int j = 1; j <= bLength; j++){
  10. if(A[i - 1] == B[j - 1]){
  11. dp[i][j] = dp[i - 1][j - 1] + 1;
  12. }
  13. ans = max(dp[i][j], ans);
  14. }
  15. }
  16. return ans;
  17. }
  18. };