718. 最长重复子数组

    技术2022-07-10  145

    给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

    目录

    1、题目分析

    2、解题分析

    3、代码


    示例 1:

    输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的公共子数组是 [3, 2, 1]。

    1、题目分析

    求两个数组公共的子数组的长度,那么可以用较短的那个字符串去匹配长的字符串,使用枚举法。像最长最短的往往都可以用动态规划,不过要找出动态转移方程来。

    2、解题分析

    主要说一下滑窗法,选取较短的那个作为滑动的数组。

    声明一个临时数组,遍历较短的那个数组将遍历到的元素添加到临时数组中去,然后判断得到的字符串有没有在较长的数组中 如果在的话就更新公共子数组的长度如果不在的话那就从头开始,不要之前的元素最后返回更新的最大长度

    3、代码

    class Solution: def findLength(self, A: List[int], B: List[int]) -> int: # 动态规划算法 l1 = len(A) l2 = len(B) #dp[i][j]代表以A[i-1]与B[j-1]结尾的公共字串的长度,公共字串必须以A[i-1],B[j-1]结束 dp = [[0 for _ in range(l2+1)] for _ in range(l1+1)] for i in range(1,l1+1): for j in range(1,l2+1): if A[i-1] == B[j-1]: dp[i][j] = dp[i-1][j-1] + 1 return max(max(row) for row in dp) ''' 3 2 1 4 7 1 0 0 1 0 0 2 0 1 0 0 0 3 1 0 0 0 0 2 0 2 0 0 0 1 0 0 3 0 0 ''' #如果A或者B有一个数组是空的就直接返回None if not A or not B: return None #如果A的长度是大于B的长度,那就交换一下,因为我想让A当滑窗的那个数组 if len(A)>len(B): A,B = B,A #对A和B做处理 A = [str(i) for i in A] B = ','+','.join([str(i) for i in B])+',' # B:',3,2,1,4,7,' # 为啥把B搞成这个鬼样子呢?因为避免出现歧义 # 举个例子A=[7] B=[17] # temp = 7->',7,' 这样就不会出现歧义,否则就这样 # temp = 7->7, 因为B是字符串呀,所以‘7,’ in B中,这样结果就出现误判了 # 因此必须要把B和Temp搞成',xx,x,x,xx,'这个鬼样子 #初始化结果和一个临时数组 res = 0 temp=[] for i in A: temp.append(i) if ','+','.join(temp)+',' in B: res = max(res,len(temp)) else: temp = temp[1:] return res

    总结:这个题目应该是考察的动态规划,但是在实际的操作中动态规划的时间复杂度和空间复杂度更高。

    Processed: 0.014, SQL: 9