最长重复子数组——力扣算法系列7

本文探讨了如何求解两个整数数组中的最长公共子数组长度问题,通过对比暴力检索法与滑动窗口法,详细解析了两种算法的实现过程及效率分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2020.07.01 周三
718最长重复子数组
题目:给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

示例:
输入:
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
——————————我是分割线——————————
解法:
一.对于这个题而言这是个错误解法!!!因为时间超限!!!暴力检索法。
这是我看完题目后脑子里的第一种解题方法——暴力。
思想:A从第一个元素开始遍历,每个A元素遍历时寻找是否有B元素与A元素相同,若相同则length+1,最后返回最大长度。
代码:

# 一 暴力法 超时!!!
class Solution(object):
    def findLength(self, A, B):
        """
        :type A: List[int]
        :type B: List[int]
        :rtype: int
        """
        max_length = 0
        for i in range(len(A)):
            for j in range(len(B)):
                length = 0
                while i+length<len(A) and j+length<len(B) and A[i+length]==B[j+length]:
                    length = length + 1
                if length > max_length:
                    max_length = length
        return max_length

if __name__=='__main__':
	A = [1,2,3,2,1]
	B = [3,2,1,4,7]
	print(Solution.findLength(0,A,B))

结果:
在这里插入图片描述
二.滑动窗口
思想:第一步:将数组A固定,移动B,使得B的首元素与A的某个元素对齐,找到重复数组的起始位置,计算长度。这是相对B而言把A前移。第二步:将数组B固定,移动A,使得A的首元素与B的某个元素对齐,找到重复数组的起始位置,计算长度。这是相对B而言把A后移

示例:
把A前移
把A后移
提交界面:
在这里插入图片描述
代码:

class Solution(object):
    def findLength(self, A, B):
        """
        :type A: List[int]
        :type B: List[int]
        :rtype: int
        """
        def get_max_length(a,b,length): #a为A的初始位置 b为B的初始位置
        	max_length = 0 #初始化最大长度
        	count = 0 #相同元素的个数
        	for i in range(length):
        		if A[a+i]==B[b+i]: #AB元素相同则count+1 max_length和选最大
        			count = count + 1
        			max_length = max(max_length,count)
        		else: #AB元素不同则count=0
        			count = 0
        	return max_length #返回最大长度

        A_len = len(A)
        B_len = len(B)
        max_len = 0
        # 把A前移
        for i in range(A_len):
        	length = min(A_len-i,B_len) #每次遍历前把A-i 即代表长度-1
        	max_len = max(max_len,get_max_length(i,0,length)) #A从i开始 B从0开始
        #把A后移
        for j in range(B_len):
        	length = min(A_len,B_len-j)
        	max_len = max(max_len,get_max_length(0,j,length))

        return max_len

if __name__=='__main__':
	A = [1,2,3,2,1]
	B = [3,2,1,4,7]
	print(Solution.findLength(0,A,B))

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值