Skip to content

Commit 7faf2f3

Browse files
committed
feat: add solutions to lc problem: No.0718
No.0718.Maximum Length of Repeated Subarray
1 parent b9da045 commit 7faf2f3

File tree

8 files changed

+187
-51
lines changed

8 files changed

+187
-51
lines changed

solution/0700-0799/0718.Maximum Length of Repeated Subarray/README.md

+75-17
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,20 @@
4040

4141
**方法一:动态规划**
4242

43+
我们定义 $f[i][j]$ 表示以 $nums1[i - 1]$ 和 $nums2[j - 1]$ 结尾的最长公共子数组的长度,那么我们可以得到状态转移方程:
44+
45+
$$
46+
f[i][j]=
47+
\begin{cases}
48+
0, & nums1[i - 1] \neq nums2[j - 1] \\
49+
f[i - 1][j - 1] + 1, & nums1[i - 1] = nums2[j - 1]
50+
\end{cases}
51+
$$
52+
53+
最终的答案即为所有 $f[i][j]$ 中的最大值。
54+
55+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是数组 $nums1$ 和 $nums2$ 的长度。
56+
4357
<!-- tabs:start -->
4458

4559
### **Python3**
@@ -50,13 +64,13 @@
5064
class Solution:
5165
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
5266
m, n = len(nums1), len(nums2)
53-
dp = [[0] * (n + 1) for _ in range(m + 1)]
67+
f = [[0] * (n + 1) for _ in range(m + 1)]
5468
ans = 0
5569
for i in range(1, m + 1):
5670
for j in range(1, n + 1):
5771
if nums1[i - 1] == nums2[j - 1]:
58-
dp[i][j] = 1 + dp[i - 1][j - 1]
59-
ans = max(ans, dp[i][j])
72+
f[i][j] = f[i - 1][j - 1] + 1
73+
ans = max(ans, f[i][j])
6074
return ans
6175
```
6276

@@ -69,13 +83,13 @@ class Solution {
6983
public int findLength(int[] nums1, int[] nums2) {
7084
int m = nums1.length;
7185
int n = nums2.length;
72-
int[][] dp = new int[m + 1][n + 1];
86+
int[][] f = new int[m + 1][n + 1];
7387
int ans = 0;
7488
for (int i = 1; i <= m; ++i) {
7589
for (int j = 1; j <= n; ++j) {
7690
if (nums1[i - 1] == nums2[j - 1]) {
77-
dp[i][j] = dp[i - 1][j - 1] + 1;
78-
ans = Math.max(ans, dp[i][j]);
91+
f[i][j] = f[i - 1][j - 1] + 1;
92+
ans = Math.max(ans, f[i][j]);
7993
}
8094
}
8195
}
@@ -91,13 +105,13 @@ class Solution {
91105
public:
92106
int findLength(vector<int>& nums1, vector<int>& nums2) {
93107
int m = nums1.size(), n = nums2.size();
94-
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
108+
vector<vector<int>> f(m + 1, vector<int>(n + 1));
95109
int ans = 0;
96110
for (int i = 1; i <= m; ++i) {
97111
for (int j = 1; j <= n; ++j) {
98112
if (nums1[i - 1] == nums2[j - 1]) {
99-
dp[i][j] = dp[i - 1][j - 1] + 1;
100-
ans = max(ans, dp[i][j]);
113+
f[i][j] = f[i - 1][j - 1] + 1;
114+
ans = max(ans, f[i][j]);
101115
}
102116
}
103117
}
@@ -109,19 +123,18 @@ public:
109123
### **Go**
110124
111125
```go
112-
func findLength(nums1 []int, nums2 []int) int {
126+
func findLength(nums1 []int, nums2 []int) (ans int) {
113127
m, n := len(nums1), len(nums2)
114-
dp := make([][]int, m+1)
115-
for i := range dp {
116-
dp[i] = make([]int, n+1)
128+
f := make([][]int, m+1)
129+
for i := range f {
130+
f[i] = make([]int, n+1)
117131
}
118-
ans := 0
119132
for i := 1; i <= m; i++ {
120133
for j := 1; j <= n; j++ {
121134
if nums1[i-1] == nums2[j-1] {
122-
dp[i][j] = dp[i-1][j-1] + 1
123-
if ans < dp[i][j] {
124-
ans = dp[i][j]
135+
f[i][j] = f[i-1][j-1] + 1
136+
if ans < f[i][j] {
137+
ans = f[i][j]
125138
}
126139
}
127140
}
@@ -130,6 +143,51 @@ func findLength(nums1 []int, nums2 []int) int {
130143
}
131144
```
132145

146+
### **TypeScript**
147+
148+
```ts
149+
function findLength(nums1: number[], nums2: number[]): number {
150+
const m = nums1.length;
151+
const n = nums2.length;
152+
const f = Array.from({ length: m + 1 }, _ => new Array(n + 1).fill(0));
153+
let ans = 0;
154+
for (let i = 1; i <= m; ++i) {
155+
for (let j = 1; j <= n; ++j) {
156+
if (nums1[i - 1] == nums2[j - 1]) {
157+
f[i][j] = f[i - 1][j - 1] + 1;
158+
ans = Math.max(ans, f[i][j]);
159+
}
160+
}
161+
}
162+
return ans;
163+
}
164+
```
165+
166+
### **JavaScript**
167+
168+
```js
169+
/**
170+
* @param {number[]} nums1
171+
* @param {number[]} nums2
172+
* @return {number}
173+
*/
174+
var findLength = function (nums1, nums2) {
175+
const m = nums1.length;
176+
const n = nums2.length;
177+
const f = Array.from({ length: m + 1 }, _ => new Array(n + 1).fill(0));
178+
let ans = 0;
179+
for (let i = 1; i <= m; ++i) {
180+
for (let j = 1; j <= n; ++j) {
181+
if (nums1[i - 1] == nums2[j - 1]) {
182+
f[i][j] = f[i - 1][j - 1] + 1;
183+
ans = Math.max(ans, f[i][j]);
184+
}
185+
}
186+
}
187+
return ans;
188+
};
189+
```
190+
133191
### **...**
134192

135193
```

solution/0700-0799/0718.Maximum Length of Repeated Subarray/README_EN.md

+61-17
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@
4141
class Solution:
4242
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
4343
m, n = len(nums1), len(nums2)
44-
dp = [[0] * (n + 1) for _ in range(m + 1)]
44+
f = [[0] * (n + 1) for _ in range(m + 1)]
4545
ans = 0
4646
for i in range(1, m + 1):
4747
for j in range(1, n + 1):
4848
if nums1[i - 1] == nums2[j - 1]:
49-
dp[i][j] = 1 + dp[i - 1][j - 1]
50-
ans = max(ans, dp[i][j])
49+
f[i][j] = f[i - 1][j - 1] + 1
50+
ans = max(ans, f[i][j])
5151
return ans
5252
```
5353

@@ -58,13 +58,13 @@ class Solution {
5858
public int findLength(int[] nums1, int[] nums2) {
5959
int m = nums1.length;
6060
int n = nums2.length;
61-
int[][] dp = new int[m + 1][n + 1];
61+
int[][] f = new int[m + 1][n + 1];
6262
int ans = 0;
6363
for (int i = 1; i <= m; ++i) {
6464
for (int j = 1; j <= n; ++j) {
6565
if (nums1[i - 1] == nums2[j - 1]) {
66-
dp[i][j] = dp[i - 1][j - 1] + 1;
67-
ans = Math.max(ans, dp[i][j]);
66+
f[i][j] = f[i - 1][j - 1] + 1;
67+
ans = Math.max(ans, f[i][j]);
6868
}
6969
}
7070
}
@@ -80,13 +80,13 @@ class Solution {
8080
public:
8181
int findLength(vector<int>& nums1, vector<int>& nums2) {
8282
int m = nums1.size(), n = nums2.size();
83-
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
83+
vector<vector<int>> f(m + 1, vector<int>(n + 1));
8484
int ans = 0;
8585
for (int i = 1; i <= m; ++i) {
8686
for (int j = 1; j <= n; ++j) {
8787
if (nums1[i - 1] == nums2[j - 1]) {
88-
dp[i][j] = dp[i - 1][j - 1] + 1;
89-
ans = max(ans, dp[i][j]);
88+
f[i][j] = f[i - 1][j - 1] + 1;
89+
ans = max(ans, f[i][j]);
9090
}
9191
}
9292
}
@@ -98,19 +98,18 @@ public:
9898
### **Go**
9999
100100
```go
101-
func findLength(nums1 []int, nums2 []int) int {
101+
func findLength(nums1 []int, nums2 []int) (ans int) {
102102
m, n := len(nums1), len(nums2)
103-
dp := make([][]int, m+1)
104-
for i := range dp {
105-
dp[i] = make([]int, n+1)
103+
f := make([][]int, m+1)
104+
for i := range f {
105+
f[i] = make([]int, n+1)
106106
}
107-
ans := 0
108107
for i := 1; i <= m; i++ {
109108
for j := 1; j <= n; j++ {
110109
if nums1[i-1] == nums2[j-1] {
111-
dp[i][j] = dp[i-1][j-1] + 1
112-
if ans < dp[i][j] {
113-
ans = dp[i][j]
110+
f[i][j] = f[i-1][j-1] + 1
111+
if ans < f[i][j] {
112+
ans = f[i][j]
114113
}
115114
}
116115
}
@@ -119,6 +118,51 @@ func findLength(nums1 []int, nums2 []int) int {
119118
}
120119
```
121120

121+
### **TypeScript**
122+
123+
```ts
124+
function findLength(nums1: number[], nums2: number[]): number {
125+
const m = nums1.length;
126+
const n = nums2.length;
127+
const f = Array.from({ length: m + 1 }, _ => new Array(n + 1).fill(0));
128+
let ans = 0;
129+
for (let i = 1; i <= m; ++i) {
130+
for (let j = 1; j <= n; ++j) {
131+
if (nums1[i - 1] == nums2[j - 1]) {
132+
f[i][j] = f[i - 1][j - 1] + 1;
133+
ans = Math.max(ans, f[i][j]);
134+
}
135+
}
136+
}
137+
return ans;
138+
}
139+
```
140+
141+
### **JavaScript**
142+
143+
```js
144+
/**
145+
* @param {number[]} nums1
146+
* @param {number[]} nums2
147+
* @return {number}
148+
*/
149+
var findLength = function (nums1, nums2) {
150+
const m = nums1.length;
151+
const n = nums2.length;
152+
const f = Array.from({ length: m + 1 }, _ => new Array(n + 1).fill(0));
153+
let ans = 0;
154+
for (let i = 1; i <= m; ++i) {
155+
for (let j = 1; j <= n; ++j) {
156+
if (nums1[i - 1] == nums2[j - 1]) {
157+
f[i][j] = f[i - 1][j - 1] + 1;
158+
ans = Math.max(ans, f[i][j]);
159+
}
160+
}
161+
}
162+
return ans;
163+
};
164+
```
165+
122166
### **...**
123167

124168
```

solution/0700-0799/0718.Maximum Length of Repeated Subarray/Solution.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ class Solution {
22
public:
33
int findLength(vector<int>& nums1, vector<int>& nums2) {
44
int m = nums1.size(), n = nums2.size();
5-
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
5+
vector<vector<int>> f(m + 1, vector<int>(n + 1));
66
int ans = 0;
77
for (int i = 1; i <= m; ++i) {
88
for (int j = 1; j <= n; ++j) {
99
if (nums1[i - 1] == nums2[j - 1]) {
10-
dp[i][j] = dp[i - 1][j - 1] + 1;
11-
ans = max(ans, dp[i][j]);
10+
f[i][j] = f[i - 1][j - 1] + 1;
11+
ans = max(ans, f[i][j]);
1212
}
1313
}
1414
}

solution/0700-0799/0718.Maximum Length of Repeated Subarray/Solution.go

+7-8
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
func findLength(nums1 []int, nums2 []int) int {
1+
func findLength(nums1 []int, nums2 []int) (ans int) {
22
m, n := len(nums1), len(nums2)
3-
dp := make([][]int, m+1)
4-
for i := range dp {
5-
dp[i] = make([]int, n+1)
3+
f := make([][]int, m+1)
4+
for i := range f {
5+
f[i] = make([]int, n+1)
66
}
7-
ans := 0
87
for i := 1; i <= m; i++ {
98
for j := 1; j <= n; j++ {
109
if nums1[i-1] == nums2[j-1] {
11-
dp[i][j] = dp[i-1][j-1] + 1
12-
if ans < dp[i][j] {
13-
ans = dp[i][j]
10+
f[i][j] = f[i-1][j-1] + 1
11+
if ans < f[i][j] {
12+
ans = f[i][j]
1413
}
1514
}
1615
}

solution/0700-0799/0718.Maximum Length of Repeated Subarray/Solution.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ class Solution {
22
public int findLength(int[] nums1, int[] nums2) {
33
int m = nums1.length;
44
int n = nums2.length;
5-
int[][] dp = new int[m + 1][n + 1];
5+
int[][] f = new int[m + 1][n + 1];
66
int ans = 0;
77
for (int i = 1; i <= m; ++i) {
88
for (int j = 1; j <= n; ++j) {
99
if (nums1[i - 1] == nums2[j - 1]) {
10-
dp[i][j] = dp[i - 1][j - 1] + 1;
11-
ans = Math.max(ans, dp[i][j]);
10+
f[i][j] = f[i - 1][j - 1] + 1;
11+
ans = Math.max(ans, f[i][j]);
1212
}
1313
}
1414
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* @param {number[]} nums1
3+
* @param {number[]} nums2
4+
* @return {number}
5+
*/
6+
var findLength = function (nums1, nums2) {
7+
const m = nums1.length;
8+
const n = nums2.length;
9+
const f = Array.from({ length: m + 1 }, _ => new Array(n + 1).fill(0));
10+
let ans = 0;
11+
for (let i = 1; i <= m; ++i) {
12+
for (let j = 1; j <= n; ++j) {
13+
if (nums1[i - 1] == nums2[j - 1]) {
14+
f[i][j] = f[i - 1][j - 1] + 1;
15+
ans = Math.max(ans, f[i][j]);
16+
}
17+
}
18+
}
19+
return ans;
20+
};
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
class Solution:
22
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
33
m, n = len(nums1), len(nums2)
4-
dp = [[0] * (n + 1) for _ in range(m + 1)]
4+
f = [[0] * (n + 1) for _ in range(m + 1)]
55
ans = 0
66
for i in range(1, m + 1):
77
for j in range(1, n + 1):
88
if nums1[i - 1] == nums2[j - 1]:
9-
dp[i][j] = 1 + dp[i - 1][j - 1]
10-
ans = max(ans, dp[i][j])
9+
f[i][j] = f[i - 1][j - 1] + 1
10+
ans = max(ans, f[i][j])
1111
return ans
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
function findLength(nums1: number[], nums2: number[]): number {
2+
const m = nums1.length;
3+
const n = nums2.length;
4+
const f = Array.from({ length: m + 1 }, _ => new Array(n + 1).fill(0));
5+
let ans = 0;
6+
for (let i = 1; i <= m; ++i) {
7+
for (let j = 1; j <= n; ++j) {
8+
if (nums1[i - 1] == nums2[j - 1]) {
9+
f[i][j] = f[i - 1][j - 1] + 1;
10+
ans = Math.max(ans, f[i][j]);
11+
}
12+
}
13+
}
14+
return ans;
15+
}

0 commit comments

Comments
 (0)