Skip to content

Commit 131c30e

Browse files
committedFeb 27, 2023
feat: add solutions to lc problems: No.1143,1144
* No.1143.Longest Common Subsequence * No.1144.Decrease Elements To Make Array Zigzag
1 parent a77041c commit 131c30e

File tree

13 files changed

+249
-106
lines changed

13 files changed

+249
-106
lines changed
 

‎solution/1100-1199/1143.Longest Common Subsequence/README.md

+66-37
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,19 @@
5757

5858
**方法一:动态规划**
5959

60-
定义 `dp[i][j]` 表示 `text1[0:i-1]``text2[0:j-1]` 的最长公共子序列(闭区间)
60+
我们定义 $f[i][j]$ 表示 $text1$ 的前 $i$ 个字符和 $text2$ 的前 $j$ 个字符的最长公共子序列的长度。那么答案为 $f[m][n]$,其中 $m$ 和 $n$ 分别为 $text1$ 和 $text2$ 的长度
6161

62-
递推公式如下
62+
如果 $text1$ 的第 $i$ 个字符和 $text2$ 的第 $j$ 个字符相同,则 $f[i][j] = f[i - 1][j - 1] + 1$;如果 $text1$ 的第 $i$ 个字符和 $text2$ 的第 $j$ 个字符不同,则 $f[i][j] = max(f[i - 1][j], f[i][j - 1])$。即状态转移方程为
6363

64-
![](https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/1100-1199/1143.Longest%20Common%20Subsequence/images/CodeCogsEqn.gif)
64+
$$
65+
f[i][j] =
66+
\begin{cases}
67+
f[i - 1][j - 1] + 1, & text1[i - 1] = text2[j - 1] \\
68+
max(f[i - 1][j], f[i][j - 1]), & text1[i - 1] \neq text2[j - 1]
69+
\end{cases}
70+
$$
6571

66-
时间复杂度$O(mn)$
72+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为 $text1$ 和 $text2$ 的长度
6773

6874
<!-- tabs:start -->
6975

@@ -75,14 +81,14 @@
7581
class Solution:
7682
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
7783
m, n = len(text1), len(text2)
78-
dp = [[0] * (n + 1) for _ in range(m + 1)]
84+
f = [[0] * (n + 1) for _ in range(m + 1)]
7985
for i in range(1, m + 1):
8086
for j in range(1, n + 1):
8187
if text1[i - 1] == text2[j - 1]:
82-
dp[i][j] = dp[i - 1][j - 1] + 1
88+
f[i][j] = f[i - 1][j - 1] + 1
8389
else:
84-
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
85-
return dp[-1][-1]
90+
f[i][j] = max(f[i - 1][j], f[i][j - 1])
91+
return f[m][n]
8692
```
8793

8894
### **Java**
@@ -93,17 +99,17 @@ class Solution:
9399
class Solution {
94100
public int longestCommonSubsequence(String text1, String text2) {
95101
int m = text1.length(), n = text2.length();
96-
int[][] dp = new int[m + 1][n + 1];
102+
int[][] f = new int[m + 1][n + 1];
97103
for (int i = 1; i <= m; ++i) {
98104
for (int j = 1; j <= n; ++j) {
99105
if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
100-
dp[i][j] = dp[i - 1][j - 1] + 1;
106+
f[i][j] = f[i - 1][j - 1] + 1;
101107
} else {
102-
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
108+
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]);
103109
}
104110
}
105111
}
106-
return dp[m][n];
112+
return f[m][n];
107113
}
108114
}
109115
```
@@ -115,16 +121,18 @@ class Solution {
115121
public:
116122
int longestCommonSubsequence(string text1, string text2) {
117123
int m = text1.size(), n = text2.size();
118-
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
124+
int f[m + 1][n + 1];
125+
memset(f, 0, sizeof f);
119126
for (int i = 1; i <= m; ++i) {
120127
for (int j = 1; j <= n; ++j) {
121-
if (text1[i - 1] == text2[j - 1])
122-
dp[i][j] = dp[i - 1][j - 1] + 1;
123-
else
124-
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
128+
if (text1[i - 1] == text2[j - 1]) {
129+
f[i][j] = f[i - 1][j - 1] + 1;
130+
} else {
131+
f[i][j] = max(f[i - 1][j], f[i][j - 1]);
132+
}
125133
}
126134
}
127-
return dp[m][n];
135+
return f[m][n];
128136
}
129137
};
130138
```
@@ -134,20 +142,20 @@ public:
134142
```go
135143
func longestCommonSubsequence(text1 string, text2 string) int {
136144
m, n := len(text1), len(text2)
137-
dp := make([][]int, m+1)
138-
for i := 0; i <= m; i++ {
139-
dp[i] = make([]int, n+1)
145+
f := make([][]int, m+1)
146+
for i := range f {
147+
f[i] = make([]int, n+1)
140148
}
141149
for i := 1; i <= m; i++ {
142150
for j := 1; j <= n; j++ {
143151
if text1[i-1] == text2[j-1] {
144-
dp[i][j] = dp[i-1][j-1] + 1
152+
f[i][j] = f[i-1][j-1] + 1
145153
} else {
146-
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
154+
f[i][j] = max(f[i-1][j], f[i][j-1])
147155
}
148156
}
149157
}
150-
return dp[m][n]
158+
return f[m][n]
151159
}
152160
153161
func max(a, b int) int {
@@ -169,17 +177,17 @@ func max(a, b int) int {
169177
var longestCommonSubsequence = function (text1, text2) {
170178
const m = text1.length;
171179
const n = text2.length;
172-
const dp = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
180+
const f = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
173181
for (let i = 1; i <= m; ++i) {
174182
for (let j = 1; j <= n; ++j) {
175183
if (text1[i - 1] == text2[j - 1]) {
176-
dp[i][j] = dp[i - 1][j - 1] + 1;
184+
f[i][j] = f[i - 1][j - 1] + 1;
177185
} else {
178-
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
186+
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]);
179187
}
180188
}
181189
}
182-
return dp[m][n];
190+
return f[m][n];
183191
};
184192
```
185193

@@ -189,17 +197,17 @@ var longestCommonSubsequence = function (text1, text2) {
189197
function longestCommonSubsequence(text1: string, text2: string): number {
190198
const m = text1.length;
191199
const n = text2.length;
192-
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
200+
const f = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
193201
for (let i = 1; i <= m; i++) {
194202
for (let j = 1; j <= n; j++) {
195203
if (text1[i - 1] === text2[j - 1]) {
196-
dp[i][j] = dp[i - 1][j - 1] + 1;
204+
f[i][j] = f[i - 1][j - 1] + 1;
197205
} else {
198-
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
206+
f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]);
199207
}
200208
}
201209
}
202-
return dp[m][n];
210+
return f[m][n];
203211
}
204212
```
205213

@@ -210,17 +218,38 @@ impl Solution {
210218
pub fn longest_common_subsequence(text1: String, text2: String) -> i32 {
211219
let (m, n) = (text1.len(), text2.len());
212220
let (text1, text2) = (text1.as_bytes(), text2.as_bytes());
213-
let mut dp = vec![vec![0; n + 1]; m + 1];
221+
let mut f = vec![vec![0; n + 1]; m + 1];
214222
for i in 1..=m {
215223
for j in 1..=n {
216-
dp[i][j] = if text1[i - 1] == text2[j - 1] {
217-
dp[i - 1][j - 1] + 1
224+
f[i][j] = if text1[i - 1] == text2[j - 1] {
225+
f[i - 1][j - 1] + 1
226+
} else {
227+
f[i - 1][j].max(f[i][j - 1])
228+
}
229+
}
230+
}
231+
f[m][n]
232+
}
233+
}
234+
```
235+
236+
### **C#**
237+
238+
```cs
239+
public class Solution {
240+
public int LongestCommonSubsequence(string text1, string text2) {
241+
int m = text1.Length, n = text2.Length;
242+
int[,] f = new int[m + 1, n + 1];
243+
for (int i = 1; i <= m; ++i) {
244+
for (int j = 1; j <= n; ++j) {
245+
if (text1[i - 1] == text2[j - 1]) {
246+
f[i, j] = f[i - 1, j - 1] + 1;
218247
} else {
219-
dp[i - 1][j].max(dp[i][j - 1])
248+
f[i, j] = Math.Max(f[i - 1, j], f[i, j - 1]);
220249
}
221250
}
222251
}
223-
dp[m][n]
252+
return f[m, n];
224253
}
225254
}
226255
```

0 commit comments

Comments
 (0)
Please sign in to comment.