Skip to content

Commit 61d5449

Browse files
committed
feat: add solutions to lc problem: No.0583
No.0583.Delete Operation for Two Strings
1 parent 81a80c8 commit 61d5449

File tree

8 files changed

+280
-2
lines changed

8 files changed

+280
-2
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
- [无矛盾的最佳球队](/solution/1600-1699/1626.Best%20Team%20With%20No%20Conflicts/README.md) - 排序、线性 DP、最长上升子序列模型
7777
- [最长公共子序列](/solution/1100-1199/1143.Longest%20Common%20Subsequence/README.md) - 线性 DP、最长公共子序列模型
7878
- [两个字符串的最小 ASCII 删除和](/solution/0700-0799/0712.Minimum%20ASCII%20Delete%20Sum%20for%20Two%20Strings/README.md) - 线性 DP、最长公共子序列模型
79+
- [两个字符串的删除操作](/solution/0500-0599/0583.Delete%20Operation%20for%20Two%20Strings/README.md) - 线性 DP、最长公共子序列模型
7980
<!-- 背包问题、状态机模型、状压DP、区间DP、树形DP、数位DP 待补充 -->
8081

8182
### 4. 高级数据结构

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
7373
- [Best Team With No Conflicts](/solution/1600-1699/1626.Best%20Team%20With%20No%20Conflicts/README_EN.md) - Sort, Linear problem, LIS
7474
- [Longest Common Subsequence](/solution/1100-1199/1143.Longest%20Common%20Subsequence/README_EN.md) - Linear problem, LCS
7575
- [Minimum ASCII Delete Sum for Two Strings](/solution/0700-0799/0712.Minimum%20ASCII%20Delete%20Sum%20for%20Two%20Strings/README_EN.md) - Linear problem, LCS
76+
- [Delete Operation for Two Strings](/solution/0500-0599/0583.Delete%20Operation%20for%20Two%20Strings/README_EN.md) - Linear problem, LCS
7677

7778
### 4. Advanced Data Structures
7879

solution/0500-0599/0583.Delete Operation for Two Strings/README.md

+101-1
Original file line numberDiff line numberDiff line change
@@ -41,22 +41,122 @@
4141

4242
<!-- 这里可写通用的实现逻辑 -->
4343

44+
**方法一:动态规划**
45+
46+
类似[1143. 最长公共子序列](/solution/1100-1199/1143.Longest%20Common%20Subsequence/README.md)
47+
48+
定义 `dp[i][j]` 表示使得 `word1[0:i-1]``word1[0:j-1]` 两个字符串相同所需执行的删除操作次数。
49+
50+
时间复杂度 O(mn)。
51+
52+
4453
<!-- tabs:start -->
4554

4655
### **Python3**
4756

4857
<!-- 这里可写当前语言的特殊实现逻辑 -->
4958

5059
```python
51-
60+
class Solution:
61+
def minDistance(self, word1: str, word2: str) -> int:
62+
m, n = len(word1), len(word2)
63+
dp = [[0] * (n + 1) for _ in range(m + 1)]
64+
for i in range(1, m + 1):
65+
dp[i][0] = i
66+
for j in range(1, n + 1):
67+
dp[0][j] = j
68+
for i in range(1, m + 1):
69+
for j in range(1, n + 1):
70+
if word1[i - 1] == word2[j - 1]:
71+
dp[i][j] = dp[i - 1][j - 1]
72+
else:
73+
dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1])
74+
return dp[-1][-1]
5275
```
5376

5477
### **Java**
5578

5679
<!-- 这里可写当前语言的特殊实现逻辑 -->
5780

5881
```java
82+
class Solution {
83+
public int minDistance(String word1, String word2) {
84+
int m = word1.length(), n = word2.length();
85+
int[][] dp = new int[m + 1][n + 1];
86+
for (int i = 1; i <= m; ++i) {
87+
dp[i][0] = i;
88+
}
89+
for (int j = 1; j <= n; ++j) {
90+
dp[0][j] = j;
91+
}
92+
for (int i = 1; i <= m; ++i) {
93+
for (int j = 1; j <= n; ++j) {
94+
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
95+
dp[i][j] = dp[i - 1][j - 1];
96+
} else {
97+
dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1]);
98+
}
99+
}
100+
}
101+
return dp[m][n];
102+
}
103+
}
104+
```
105+
106+
### **C++**
107+
108+
```cpp
109+
class Solution {
110+
public:
111+
int minDistance(string word1, string word2) {
112+
int m = word1.size(), n = word2.size();
113+
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
114+
for (int i = 1; i <= m; ++i) dp[i][0] = i;
115+
for (int j = 1; j <= n; ++j) dp[0][j] = j;
116+
for (int i = 1; i <= m; ++i)
117+
{
118+
for (int j = 1; j <= n; ++j)
119+
{
120+
if (word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i - 1][j - 1];
121+
else dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1]);
122+
}
123+
}
124+
return dp[m][n];
125+
}
126+
};
127+
```
59128
129+
### **Go**
130+
131+
```go
132+
func minDistance(word1 string, word2 string) int {
133+
m, n := len(word1), len(word2)
134+
dp := make([][]int, m+1)
135+
for i := range dp {
136+
dp[i] = make([]int, n+1)
137+
dp[i][0] = i
138+
}
139+
for j := range dp[0] {
140+
dp[0][j] = j
141+
}
142+
for i := 1; i <= m; i++ {
143+
for j := 1; j <= n; j++ {
144+
if word1[i-1] == word2[j-1] {
145+
dp[i][j] = dp[i-1][j-1]
146+
} else {
147+
dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1])
148+
}
149+
}
150+
}
151+
return dp[m][n]
152+
}
153+
154+
func min(a, b int) int {
155+
if a < b {
156+
return a
157+
}
158+
return b
159+
}
60160
```
61161

62162
### **...**

solution/0500-0599/0583.Delete Operation for Two Strings/README_EN.md

+94-1
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,111 @@
3434

3535
## Solutions
3636

37+
Dynamic programming.
38+
3739
<!-- tabs:start -->
3840

3941
### **Python3**
4042

4143
```python
42-
44+
class Solution:
45+
def minDistance(self, word1: str, word2: str) -> int:
46+
m, n = len(word1), len(word2)
47+
dp = [[0] * (n + 1) for _ in range(m + 1)]
48+
for i in range(1, m + 1):
49+
dp[i][0] = i
50+
for j in range(1, n + 1):
51+
dp[0][j] = j
52+
for i in range(1, m + 1):
53+
for j in range(1, n + 1):
54+
if word1[i - 1] == word2[j - 1]:
55+
dp[i][j] = dp[i - 1][j - 1]
56+
else:
57+
dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1])
58+
return dp[-1][-1]
4359
```
4460

4561
### **Java**
4662

4763
```java
64+
class Solution {
65+
public int minDistance(String word1, String word2) {
66+
int m = word1.length(), n = word2.length();
67+
int[][] dp = new int[m + 1][n + 1];
68+
for (int i = 1; i <= m; ++i) {
69+
dp[i][0] = i;
70+
}
71+
for (int j = 1; j <= n; ++j) {
72+
dp[0][j] = j;
73+
}
74+
for (int i = 1; i <= m; ++i) {
75+
for (int j = 1; j <= n; ++j) {
76+
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
77+
dp[i][j] = dp[i - 1][j - 1];
78+
} else {
79+
dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1]);
80+
}
81+
}
82+
}
83+
return dp[m][n];
84+
}
85+
}
86+
```
87+
88+
### **C++**
89+
90+
```cpp
91+
class Solution {
92+
public:
93+
int minDistance(string word1, string word2) {
94+
int m = word1.size(), n = word2.size();
95+
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
96+
for (int i = 1; i <= m; ++i) dp[i][0] = i;
97+
for (int j = 1; j <= n; ++j) dp[0][j] = j;
98+
for (int i = 1; i <= m; ++i)
99+
{
100+
for (int j = 1; j <= n; ++j)
101+
{
102+
if (word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i - 1][j - 1];
103+
else dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1]);
104+
}
105+
}
106+
return dp[m][n];
107+
}
108+
};
109+
```
48110
111+
### **Go**
112+
113+
```go
114+
func minDistance(word1 string, word2 string) int {
115+
m, n := len(word1), len(word2)
116+
dp := make([][]int, m+1)
117+
for i := range dp {
118+
dp[i] = make([]int, n+1)
119+
dp[i][0] = i
120+
}
121+
for j := range dp[0] {
122+
dp[0][j] = j
123+
}
124+
for i := 1; i <= m; i++ {
125+
for j := 1; j <= n; j++ {
126+
if word1[i-1] == word2[j-1] {
127+
dp[i][j] = dp[i-1][j-1]
128+
} else {
129+
dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1])
130+
}
131+
}
132+
}
133+
return dp[m][n]
134+
}
135+
136+
func min(a, b int) int {
137+
if a < b {
138+
return a
139+
}
140+
return b
141+
}
49142
```
50143

51144
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
int minDistance(string word1, string word2) {
4+
int m = word1.size(), n = word2.size();
5+
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
6+
for (int i = 1; i <= m; ++i) dp[i][0] = i;
7+
for (int j = 1; j <= n; ++j) dp[0][j] = j;
8+
for (int i = 1; i <= m; ++i)
9+
{
10+
for (int j = 1; j <= n; ++j)
11+
{
12+
if (word1[i - 1] == word2[j - 1]) dp[i][j] = dp[i - 1][j - 1];
13+
else dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1]);
14+
}
15+
}
16+
return dp[m][n];
17+
}
18+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
func minDistance(word1 string, word2 string) int {
2+
m, n := len(word1), len(word2)
3+
dp := make([][]int, m+1)
4+
for i := range dp {
5+
dp[i] = make([]int, n+1)
6+
dp[i][0] = i
7+
}
8+
for j := range dp[0] {
9+
dp[0][j] = j
10+
}
11+
for i := 1; i <= m; i++ {
12+
for j := 1; j <= n; j++ {
13+
if word1[i-1] == word2[j-1] {
14+
dp[i][j] = dp[i-1][j-1]
15+
} else {
16+
dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1])
17+
}
18+
}
19+
}
20+
return dp[m][n]
21+
}
22+
23+
func min(a, b int) int {
24+
if a < b {
25+
return a
26+
}
27+
return b
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int minDistance(String word1, String word2) {
3+
int m = word1.length(), n = word2.length();
4+
int[][] dp = new int[m + 1][n + 1];
5+
for (int i = 1; i <= m; ++i) {
6+
dp[i][0] = i;
7+
}
8+
for (int j = 1; j <= n; ++j) {
9+
dp[0][j] = j;
10+
}
11+
for (int i = 1; i <= m; ++i) {
12+
for (int j = 1; j <= n; ++j) {
13+
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
14+
dp[i][j] = dp[i - 1][j - 1];
15+
} else {
16+
dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1]);
17+
}
18+
}
19+
}
20+
return dp[m][n];
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def minDistance(self, word1: str, word2: str) -> int:
3+
m, n = len(word1), len(word2)
4+
dp = [[0] * (n + 1) for _ in range(m + 1)]
5+
for i in range(1, m + 1):
6+
dp[i][0] = i
7+
for j in range(1, n + 1):
8+
dp[0][j] = j
9+
for i in range(1, m + 1):
10+
for j in range(1, n + 1):
11+
if word1[i - 1] == word2[j - 1]:
12+
dp[i][j] = dp[i - 1][j - 1]
13+
else:
14+
dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1])
15+
return dp[-1][-1]

0 commit comments

Comments
 (0)