LeetCode 718. 最长重复子数组
题目描述
思路分析
解法一:动态规划(推荐)
核心思路:
- 设
dp[j]表示以nums1[i-1]与nums2[j-1]结尾的最长公共子数组长度。- 当
nums1[i-1] == nums2[j-1]时,dp[j] = dp[j-1] + 1,否则为 0。- 为避免覆盖,
j从后往前更新。
复杂度分析:
- 时间复杂度:O(n*m),其中 n、m 分别为两数组长度。
- 空间复杂度:O(m),使用一维滚动数组。
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int n = nums1.length;
int m = nums2.length;
int[] dp = new int[m + 1];
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = m; j >= 1; j--) {
if (nums1[i - 1] == nums2[j - 1]) {
dp[j] = dp[j - 1] + 1;
ans = Math.max(ans, dp[j]);
} else {
dp[j] = 0;
}
}
}
return ans;
}
}
func findLength(nums1 []int, nums2 []int) int {
m := len(nums2)
dp := make([]int, m+1)
ans := 0
for i := 1; i <= len(nums1); i++ {
for j := m; j >= 1; j-- {
if nums1[i-1] == nums2[j-1] {
dp[j] = dp[j-1] + 1
if dp[j] > ans {
ans = dp[j]
}
} else {
dp[j] = 0
}
}
}
return ans
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 1143. 最长公共子序列 | 中等 | 动态规划 |
| 718. 最长重复子数组 | 中等 | 动态规划 |
| 1035. 不相交的线 | 中等 | 动态规划 |
| 300. 最长递增子序列 | 中等 | 动态规划 |
| 647. 回文子串 | 中等 | 动态规划 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
