40
40
41
41
** 方法一:动态规划**
42
42
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
+
43
57
<!-- tabs:start -->
44
58
45
59
### ** Python3**
50
64
class Solution :
51
65
def findLength (self , nums1 : List[int ], nums2 : List[int ]) -> int :
52
66
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 )]
54
68
ans = 0
55
69
for i in range (1 , m + 1 ):
56
70
for j in range (1 , n + 1 ):
57
71
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])
60
74
return ans
61
75
```
62
76
@@ -69,13 +83,13 @@ class Solution {
69
83
public int findLength (int [] nums1 , int [] nums2 ) {
70
84
int m = nums1. length;
71
85
int n = nums2. length;
72
- int [][] dp = new int [m + 1 ][n + 1 ];
86
+ int [][] f = new int [m + 1 ][n + 1 ];
73
87
int ans = 0 ;
74
88
for (int i = 1 ; i <= m; ++ i) {
75
89
for (int j = 1 ; j <= n; ++ j) {
76
90
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]);
79
93
}
80
94
}
81
95
}
@@ -91,13 +105,13 @@ class Solution {
91
105
public:
92
106
int findLength(vector<int >& nums1, vector<int >& nums2) {
93
107
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));
95
109
int ans = 0;
96
110
for (int i = 1; i <= m; ++i) {
97
111
for (int j = 1; j <= n; ++j) {
98
112
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 ] );
101
115
}
102
116
}
103
117
}
@@ -109,19 +123,18 @@ public:
109
123
### **Go**
110
124
111
125
```go
112
- func findLength(nums1 []int, nums2 []int) int {
126
+ func findLength(nums1 []int, nums2 []int) (ans int) {
113
127
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)
117
131
}
118
- ans := 0
119
132
for i := 1; i <= m; i++ {
120
133
for j := 1; j <= n; j++ {
121
134
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]
125
138
}
126
139
}
127
140
}
@@ -130,6 +143,51 @@ func findLength(nums1 []int, nums2 []int) int {
130
143
}
131
144
```
132
145
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
+
133
191
### ** ...**
134
192
135
193
```
0 commit comments