718-Maximum length of repeated subarry

题目描述

链接:https://leetcode.com/problems/maximum-length-of-repeated-subarray/description/

Given two integer arrays nums1 and nums2, return the maximum length of a subarray that appears in both arrays.

解释: 给定两个数组nums1nums2, 求两个数组的最长公共子数组

案例:
Input: nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
Output: 3
Explanation: The repeated subarray with maximum length is [3,2,1].

解释:最长公共子数组为[3,2,1]

基本思想

经典二维动态规划。dp[i][j] 表示以nums[i]和 nums[j]为结尾的 nums1[0...,i1]nums2[0...,j1] 的最长公共子串,则

  • 如果 nums1[i]==nums2[j],dp[i][j] = dp[i1][j1]+1
  • 反之,dp[i][j] = 0

时间复杂度o(n2)

代码

c++

int findLength(vector<int>& nums1, vector<int>& nums2) {
int n = nums1.size();
int m = nums2.size();
if (n<=0 || m<=0) return 0;
vector<vector<int>> dp(n, vector<int>(m,0));
int res = 0;
// - 初始化
for(int i=0; i<m;++i) {
if (nums1[0] == nums2[i])
dp[0][i] = 1;
res = max(dp[0][i], res);
}
for(int i=0; i<n;++i) {
if (nums1[i] == nums2[0])
dp[i][0] = 1;
res = max(dp[i][0], res);
}
for(int i=1;i<n;++i) {
for(int j=1;j<m;++j) {
if (nums1[i] == nums2[j]) {
dp[i][j] = dp[i-1][j-1]+1;
}
res = max(res, dp[i][j]);
}
}
return res;
}
};

python

def findLength(self, nums1: List[int], nums2: List[int]) -> int:
n,m = len(nums1), len(nums2)
if n<=0 or m<0: return 0
dp = [[0] * m for i in range(n)]
res = 0
for i in range(n):
for j in range(m):
if (nums1[i] == nums2[j]):
if (i-1)>=0 and (j-1)>=0:
dp[i][j] = dp[i-1][j-1]+1
else:
dp[i][j] = 1
res = max(res, dp[i][j])
return res
posted @   金字塔下的蜗牛  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示