Skip to content

Commit ae731d1

Browse files
committed
feat: add solutions to lc problems: No.0712,0713
* No.0712.Minimum ASCII Delete Sum for Two Strings * No.0713.Subarray Product Less Than K
1 parent 7faf2f3 commit ae731d1

File tree

11 files changed

+407
-92
lines changed

11 files changed

+407
-92
lines changed

solution/0700-0799/0712.Minimum ASCII Delete Sum for Two Strings/README.md

+119-35
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,27 @@
4646

4747
**方法一:动态规划**
4848

49-
类似[1143. 最长公共子序列](/solution/1100-1199/1143.Longest%20Common%20Subsequence/README.md)
49+
我们定义 $f[i][j]$ 表示使得 $s_1$ 的前 $i$ 个字符和 $s_2$ 的前 $j$ 个字符相等所需删除字符的 ASCII 值的最小和。那么答案就是 $f[m][n]$
5050

51-
定义 `dp[i][j]` 表示使得 `s1[0:i-1]``s2[0:j-1]` 两个字符串相等所需删除的字符的 ASCII 值的最小值。
51+
如果 $s_1[i-1] = s_2[j-1]$,那么 $f[i][j] = f[i-1][j-1]$。否则,我们可以删除 $s_1[i-1]$ 或者 $s_2[j-1]$ 中的一个,使得 $f[i][j]$ 达到最小。因此,状态转移方程如下:
5252

53-
时间复杂度 O(mn)。
53+
$$
54+
f[i][j]=
55+
\begin{cases}
56+
f[i-1][j-1], & s_1[i-1] = s_2[j-1] \\
57+
min(f[i-1][j] + s_1[i-1], f[i][j-1] + s_2[j-1]), & s_1[i-1] \neq s_2[j-1]
58+
\end{cases}
59+
$$
60+
61+
初始状态为 $f[0][j] = f[0][j-1] + s_2[j-1]$,$f[i][0] = f[i-1][0] + s_1[i-1]$。
62+
63+
最后返回 $f[m][n]$ 即可。
64+
65+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是 $s_1$ 和 $s_2$ 的长度。
66+
67+
相似题目:
68+
69+
- [1143. 最长公共子序列](/solution/1100-1199/1143.Longest%20Common%20Subsequence/README.md)
5470

5571
<!-- tabs:start -->
5672

@@ -62,20 +78,20 @@
6278
class Solution:
6379
def minimumDeleteSum(self, s1: str, s2: str) -> int:
6480
m, n = len(s1), len(s2)
65-
dp = [[0] * (n + 1) for _ in range(m + 1)]
81+
f = [[0] * (n + 1) for _ in range(m + 1)]
6682
for i in range(1, m + 1):
67-
dp[i][0] = dp[i - 1][0] + ord(s1[i - 1])
83+
f[i][0] = f[i - 1][0] + ord(s1[i - 1])
6884
for j in range(1, n + 1):
69-
dp[0][j] = dp[0][j - 1] + ord(s2[j - 1])
85+
f[0][j] = f[0][j - 1] + ord(s2[j - 1])
7086
for i in range(1, m + 1):
7187
for j in range(1, n + 1):
7288
if s1[i - 1] == s2[j - 1]:
73-
dp[i][j] = dp[i - 1][j - 1]
89+
f[i][j] = f[i - 1][j - 1]
7490
else:
75-
dp[i][j] = min(
76-
dp[i - 1][j] + ord(s1[i - 1]), dp[i][j - 1] + ord(s2[j - 1])
91+
f[i][j] = min(
92+
f[i - 1][j] + ord(s1[i - 1]), f[i][j - 1] + ord(s2[j - 1])
7793
)
78-
return dp[-1][-1]
94+
return f[m][n]
7995
```
8096

8197
### **Java**
@@ -86,24 +102,23 @@ class Solution:
86102
class Solution {
87103
public int minimumDeleteSum(String s1, String s2) {
88104
int m = s1.length(), n = s2.length();
89-
int[][] dp = new int[m + 1][n + 1];
105+
int[][] f = new int[m + 1][n + 1];
90106
for (int i = 1; i <= m; ++i) {
91-
dp[i][0] = dp[i - 1][0] + s1.codePointAt(i - 1);
107+
f[i][0] = f[i - 1][0] + s1.charAt(i - 1);
92108
}
93109
for (int j = 1; j <= n; ++j) {
94-
dp[0][j] = dp[0][j - 1] + s2.codePointAt(j - 1);
110+
f[0][j] = f[0][j - 1] + s2.charAt(j - 1);
95111
}
96112
for (int i = 1; i <= m; ++i) {
97113
for (int j = 1; j <= n; ++j) {
98114
if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
99-
dp[i][j] = dp[i - 1][j - 1];
115+
f[i][j] = f[i - 1][j - 1];
100116
} else {
101-
dp[i][j] = Math.min(
102-
dp[i - 1][j] + s1.codePointAt(i - 1), dp[i][j - 1] + s2.codePointAt(j - 1));
117+
f[i][j] = Math.min(f[i - 1][j] + s1.charAt(i - 1), f[i][j - 1] + s2.charAt(j - 1));
103118
}
104119
}
105120
}
106-
return dp[m][n];
121+
return f[m][n];
107122
}
108123
}
109124
```
@@ -115,18 +130,24 @@ class Solution {
115130
public:
116131
int minimumDeleteSum(string s1, string s2) {
117132
int m = s1.size(), n = s2.size();
118-
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
119-
for (int i = 1; i <= m; ++i) dp[i][0] = dp[i - 1][0] + s1[i - 1];
120-
for (int j = 1; j <= n; ++j) dp[0][j] = dp[0][j - 1] + s2[j - 1];
133+
int f[m + 1][n + 1];
134+
memset(f, 0, sizeof f);
135+
for (int i = 1; i <= m; ++i) {
136+
f[i][0] = f[i - 1][0] + s1[i - 1];
137+
}
138+
for (int j = 1; j <= n; ++j) {
139+
f[0][j] = f[0][j - 1] + s2[j - 1];
140+
}
121141
for (int i = 1; i <= m; ++i) {
122142
for (int j = 1; j <= n; ++j) {
123-
if (s1[i - 1] == s2[j - 1])
124-
dp[i][j] = dp[i - 1][j - 1];
125-
else
126-
dp[i][j] = min(dp[i - 1][j] + s1[i - 1], dp[i][j - 1] + s2[j - 1]);
143+
if (s1[i - 1] == s2[j - 1]) {
144+
f[i][j] = f[i - 1][j - 1];
145+
} else {
146+
f[i][j] = min(f[i - 1][j] + s1[i - 1], f[i][j - 1] + s2[j - 1]);
147+
}
127148
}
128149
}
129-
return dp[m][n];
150+
return f[m][n];
130151
}
131152
};
132153
```
@@ -136,26 +157,26 @@ public:
136157
```go
137158
func minimumDeleteSum(s1 string, s2 string) int {
138159
m, n := len(s1), len(s2)
139-
dp := make([][]int, m+1)
140-
for i := range dp {
141-
dp[i] = make([]int, n+1)
160+
f := make([][]int, m+1)
161+
for i := range f {
162+
f[i] = make([]int, n+1)
142163
}
143-
for i := 1; i <= m; i++ {
144-
dp[i][0] = dp[i-1][0] + int(s1[i-1])
164+
for i, c := range s1 {
165+
f[i+1][0] = f[i][0] + int(c)
145166
}
146-
for j := 1; j <= n; j++ {
147-
dp[0][j] = dp[0][j-1] + int(s2[j-1])
167+
for j, c := range s2 {
168+
f[0][j+1] = f[0][j] + int(c)
148169
}
149170
for i := 1; i <= m; i++ {
150171
for j := 1; j <= n; j++ {
151172
if s1[i-1] == s2[j-1] {
152-
dp[i][j] = dp[i-1][j-1]
173+
f[i][j] = f[i-1][j-1]
153174
} else {
154-
dp[i][j] = min(dp[i-1][j]+int(s1[i-1]), dp[i][j-1]+int(s2[j-1]))
175+
f[i][j] = min(f[i-1][j]+int(s1[i-1]), f[i][j-1]+int(s2[j-1]))
155176
}
156177
}
157178
}
158-
return dp[m][n]
179+
return f[m][n]
159180
}
160181
161182
func min(a, b int) int {
@@ -166,6 +187,69 @@ func min(a, b int) int {
166187
}
167188
```
168189

190+
### **TypeScript**
191+
192+
```ts
193+
function minimumDeleteSum(s1: string, s2: string): number {
194+
const m = s1.length;
195+
const n = s2.length;
196+
const f = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
197+
for (let i = 1; i <= m; ++i) {
198+
f[i][0] = f[i - 1][0] + s1[i - 1].charCodeAt(0);
199+
}
200+
for (let j = 1; j <= n; ++j) {
201+
f[0][j] = f[0][j - 1] + s2[j - 1].charCodeAt(0);
202+
}
203+
for (let i = 1; i <= m; ++i) {
204+
for (let j = 1; j <= n; ++j) {
205+
if (s1[i - 1] === s2[j - 1]) {
206+
f[i][j] = f[i - 1][j - 1];
207+
} else {
208+
f[i][j] = Math.min(
209+
f[i - 1][j] + s1[i - 1].charCodeAt(0),
210+
f[i][j - 1] + s2[j - 1].charCodeAt(0),
211+
);
212+
}
213+
}
214+
}
215+
return f[m][n];
216+
}
217+
```
218+
219+
### **JavaScript**
220+
221+
```js
222+
/**
223+
* @param {string} s1
224+
* @param {string} s2
225+
* @return {number}
226+
*/
227+
var minimumDeleteSum = function (s1, s2) {
228+
const m = s1.length;
229+
const n = s2.length;
230+
const f = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
231+
for (let i = 1; i <= m; ++i) {
232+
f[i][0] = f[i - 1][0] + s1[i - 1].charCodeAt(0);
233+
}
234+
for (let j = 1; j <= n; ++j) {
235+
f[0][j] = f[0][j - 1] + s2[j - 1].charCodeAt(0);
236+
}
237+
for (let i = 1; i <= m; ++i) {
238+
for (let j = 1; j <= n; ++j) {
239+
if (s1[i - 1] === s2[j - 1]) {
240+
f[i][j] = f[i - 1][j - 1];
241+
} else {
242+
f[i][j] = Math.min(
243+
f[i - 1][j] + s1[i - 1].charCodeAt(0),
244+
f[i][j - 1] + s2[j - 1].charCodeAt(0),
245+
);
246+
}
247+
}
248+
}
249+
return f[m][n];
250+
};
251+
```
252+
169253
### **...**
170254

171255
```

0 commit comments

Comments
 (0)