问题描述:
给两个整数数组 A
和 B
,返回两个数组中公共的、长度最长的子数组的长度。
示例 1:
输入: A: [1,2,3,2,1] , B: [3,2,1,4,7]
输出: 3
解释: 长度最长的公共子数组是 [3, 2, 1]。
说明:
1 <= len(A), len(B) <= 1000
0 <= A[i], B[i] < 100
问题分析:
是不是很像字符串匹配问题?,KMP算法应该就可以解决,现在介绍动态规划方法,设 dp[i][j]
表示子数组 A[:i]
和子数组 B[:j]
最长的子数组的长度,很显然得出状态方程
:
A[i - 1] == B[j - 1], dp[i][j] = dp[i - 1][j - 1] + 1
Python3实现:
# @Time :2018/09/08
# @Author :LiuYinxing
# 动态规划
class Solution:
def findLength(self, A, B):
n, m = len(A) + 1, len(B) + 1
dp = [[0] * m for _ in range(n)] # 初始化 dp
ans = 0 # 保留最优解
for i in range(1, n):
for j in range(1, m):
if A[i - 1] == B[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
ans = max(ans, dp[i][j])
return ans
if __name__ == '__main__':
solu = Solution()
A, B = [1, 2, 3, 2, 1], [3, 2, 1, 4, 7]
print(solu.findLength(A, B))
声明: 总结学习,有问题可以批评指正,大神可以略过哦。