问题描述
1.查找两个数组的最大公共子数组,要求返回的子数组是连续的。
输入:A = [3,1,3,2,1,4], B = [3,2,3,2,1,4]
输出:[3,2,1,4]
输入:A = [3,1,3,2,1,4], B = [3,2,3,1]
输出:[3,2] 或 [3,1]
算法
动态规划,同两个字符串的编辑距离、最长公共子序列LCS 解法一样。
代码
def getLongestSubVector(nums1: list, nums2: list) -> int:
m,n=len(nums1),len(nums2)
dp=[[0]*(n+1) for _ in range(m+1)]
max_i=-1
max_len=-1
for i in range(1,m+1):
for j in range(1,n+1):
if nums1[i-1]==nums2[j-1]:
dp[i][j]=dp[i-1][j-1]+1
if(dp[i][j]>max_len):
max_len=dp[i][j]
max_i=i
else:
dp[i][j]=0
print(max_len)
print(max_i)
return [] if max_len==-1 else nums1[max_i-max_len:max_i]
测试用例
def main():
nums1=[3,1,3,2,1,4]
nums2=[3,2,3,2,1,4]
res=getLongestSubVector(nums1,nums2)
print(res)
main()
最长公共子序列
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
m,n=len(text1),len(text2)
dp=[[0]*(n+1) for _ in range(m+1)]
for i in range(1,m+1):
for j in range(1,n+1):
if text1[i-1]==text2[j-1]:
dp[i][j]=dp[i-1][j-1]+1
else:
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
return dp[m][n]