题目描述:
题目大意:
返回两个整数数组的最长公共子数组(子数组是原数组中连续的一部分,最短为包含一个元素)
解题方法:
涉及子数组、子串、子序列的最优值问题基本都可以使用动态规划进行求解。我们定义dp[i][j]表示A[:i]与B[j]结尾的公共子数组长度。
因此可得状态转移方程:
if B[i-1]==A[j-1]:
dp[i][j] = dp[i-1][j-1]+1
res = max(res,dp[i][j])
else:
dp[i][j]=0
python代码为:
class Solution(object):
def findLength(self, A, B):
"""
:type A: List[int]
:type B: List[int]
:rtype: int
"""
#20:20
dp = [[0]*(len(A)+1) for _ in range(len(B)+1)]
res = 0
for i in range(1,len(B)+1):
for j in range(1,len(A)+1):
if B[i-1]==A[j-1]:
dp[i][j] = dp[i-1][j-1]+1
res = max(res,dp[i][j])
return res
这道题目中使用的二维dp数组定义方法基于LCS,同属一个系列。