步骤一、确定状态:
确定dp数组及下标含义
dp[i][j]表示的是长度为i的A数组和长度为j的B数组公共的长度最长的子数组的长 度。
步骤二、推断状态方程:
考虑下dp[i][j], 因为这里的子数组必须是连续的,所以只需要 考虑前面的一个状态即可,也就是由dp[i-1][j-1]推导出来的
如果当前的两个元素相同, 即A[i]==B[j], 则说明当前元素可 以构成公共子数组,那么当前俩数组组成的最长的公共连续子 数组长度就是dp[i-1][j-1]+1,也就是在之前的基础上加上最后 1位新的。
如果当前的两个元素不相同, 即A[i]!=B[j], 这说明当前的元 素无法构成公共子数组,因为公共子数组是连续的,而当前这 俩哥们不相等,那么此时d[i][j]=0,要从0开始重新算了。
步骤三、规定初始条件:
初始条件:
全局初始化的时候都初始化为0
步骤四、计算顺序: 外层遍历A数组,内层遍历B数组
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
if not nums1 or not nums2:
return 0
dp = [[0 for _ in range(len(nums2) + 1)] for _ in range(len(nums1) + 1)]
result = 0
for i in range(1, len(nums1) + 1):
for j in range(1, len(nums2) + 1):
if nums1[i-1] == nums2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
result = max(result, dp[i][j])
return result