题目

26年7月20日(首刷看解)
Go
func findLength(nums1 []int, nums2 []int) int {
//dp[i][j]分别表示nums1,nums2以下标i-1.j-1为结尾的长度最长的长度
dp:=make([][]int,len(nums1)+1)
for i,_ :=range dp{
dp[i]=make([]int,len(nums2)+1)
}
res:=0
for i:=1;i<=len(nums1);i++{
for j:=1;j<=len(nums2);j++{
if nums1[i-1]==nums2[j-1]{
dp[i][j]=dp[i-1][j-1]+1
res=max(res,dp[i][j])
}
}
}
return res
}
思路
这里其实默认的是连续的,题型LCS(Longest Common Subarray),
dp数组含义,dpij分别表示nums1,nums2以下标i-1.j-1为结尾的子数组最长长度,这里选择这样定义,是因为如果匹配的话,就会加在上一对匹配元素的后面,匹配段不能断。
连续的定义方式好像大多数都是这种,以某个元素结尾的子数组
然后就能想到递归公式,
如果当前这一对匹配,就在上一对的基础上+1dp[i][j]=dp[i-1][j-1]+1
如果上一对不匹配,那么就没有赋值,那么dp[i-1][j-1]=0,断掉了确实就是长度变成0,所以没问题。
但是这里根据定义也猜得到dp[len(nums)1][len(nums)2],根据dp定义不一定就是最大长度。
所以中途我们要维护一个最大值res,一直保持判断更新的状态.