Skip to content

Commit cb9f821

Browse files
committed
feat: add solutions to lc problem: No.0072. Edit Distance
1 parent 9cef172 commit cb9f821

File tree

8 files changed

+296
-15
lines changed

8 files changed

+296
-15
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@
197197
- [最长递增子序列](./solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README.md)
198198
- [摆动序列](./solution/0300-0399/0376.Wiggle%20Subsequence/README.md)
199199
- [最长公共子序列](./solution/1100-1199/1143.Longest%20Common%20Subsequence/README.md)
200+
- [编辑距离](./solution/0000-0099/0072.Edit%20Distance/README.md)
200201
- [礼物的最大价值](./lcof/面试题47.%20礼物的最大价值/README.md)
201202
- [俄罗斯套娃信封问题](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README.md)
202203

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
191191
- [Longest Increasing Subsequence](./solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README_EN.md)
192192
- [Wiggle Subsequence](./solution/0300-0399/0376.Wiggle%20Subsequence/README_EN.md)
193193
- [Longest Common Subsequence](./solution/1100-1199/1143.Longest%20Common%20Subsequence/README_EN.md)
194+
- [Edit Distance](./solution/0000-0099/0072.Edit%20Distance/README_EN.md)
194195
- [Russian Doll Envelopes](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README_EN.md)
195196

196197
### Backtracking

solution/0000-0099/0072.Edit Distance/README.md

+109-2
Original file line numberDiff line numberDiff line change
@@ -51,27 +51,134 @@ exection -> execution (插入 'u')
5151
<li><code>word1</code> 和 <code>word2</code> 由小写英文字母组成</li>
5252
</ul>
5353

54-
5554
## 解法
5655

5756
<!-- 这里可写通用的实现逻辑 -->
5857

58+
动态规划。
59+
60+
`dp[i][j]` 表示将 word1 前 i 个字符组成的字符串 `word1[0...i-1]` 转换成 word2 前 j 个字符组成的字符串 `word2[0...j-1]` 的最小操作次数。
61+
62+
初始化 `dp[i][0] = i``i∈[0, word1.length]`),`dp[0][j] = j``j∈[0, word2.length]`)。
63+
64+
i, j 分别从 1 开始遍历,判断 `word1[i - 1]``word2[j - 1]` 是否相等:
65+
66+
-`word1[i - 1] == word2[j - 1]``dp[i][j] = dp[i - 1][j - 1]`
67+
-`word1[i - 1] != word2[j - 1]``dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1`。其中 `dp[i - 1][j] + 1` 对应插入操作,`dp[i][j - 1] + 1` 对应删除操作,`dp[i - 1][j - 1] + 1` 对应替换操作。取三者的最小值即可。
68+
5969
<!-- tabs:start -->
6070

6171
### **Python3**
6272

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

6575
```python
66-
76+
class Solution:
77+
def minDistance(self, word1: str, word2: str) -> int:
78+
m, n = len(word1), len(word2)
79+
dp = [[0] * (n + 1) for _ in range(m + 1)]
80+
for i in range(m + 1):
81+
dp[i][0] = i
82+
for j in range(n + 1):
83+
dp[0][j] = j
84+
for i in range(1, m + 1):
85+
for j in range(1, n + 1):
86+
if word1[i - 1] == word2[j - 1]:
87+
dp[i][j] = dp[i - 1][j - 1]
88+
else:
89+
dp[i][j] = min(dp[i][j - 1], dp[i - 1]
90+
[j], dp[i - 1][j - 1]) + 1
91+
return dp[-1][-1]
6792
```
6893

6994
### **Java**
7095

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

7398
```java
99+
class Solution {
100+
public int minDistance(String word1, String word2) {
101+
int m = word1.length(), n = word2.length();
102+
int[][] dp = new int[m + 1][n + 1];
103+
for (int i = 0; i <= m; ++i) {
104+
dp[i][0] = i;
105+
}
106+
for (int j = 0; j <= n; ++j) {
107+
dp[0][j] = j;
108+
}
109+
for (int i = 1; i <= m; ++i) {
110+
for (int j = 1; j <= n; ++j) {
111+
if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
112+
dp[i][j] = dp[i - 1][j - 1];
113+
} else {
114+
dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
115+
}
116+
}
117+
}
118+
return dp[m][n];
119+
}
120+
}
121+
```
122+
123+
### **C++**
124+
125+
```cpp
126+
class Solution {
127+
public:
128+
int minDistance(string word1, string word2) {
129+
int m = word1.size(), n = word2.size();
130+
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
131+
for (int i = 0; i <= m; ++i) {
132+
dp[i][0] = i;
133+
}
134+
for (int j = 0; j <= n; ++j) {
135+
dp[0][j] = j;
136+
}
137+
for (int i = 1; i <= m; ++i) {
138+
for (int j = 1; j <= n; ++j) {
139+
if (word1[i - 1] == word2[j - 1]) {
140+
dp[i][j] = dp[i - 1][j - 1];
141+
} else {
142+
dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
143+
}
144+
}
145+
}
146+
return dp[m][n];
147+
}
148+
};
149+
```
74150
151+
### **Go**
152+
153+
```go
154+
func minDistance(word1 string, word2 string) int {
155+
m, n := len(word1), len(word2)
156+
dp := make([][]int, m+1)
157+
for i := 0; i <= m; i++ {
158+
dp[i] = make([]int, n+1)
159+
dp[i][0] = i
160+
}
161+
for j := 0; j <= n; j++ {
162+
dp[0][j] = j
163+
}
164+
for i := 1; i <= m; i++ {
165+
for j := 1; j <= n; j++ {
166+
if word1[i-1] == word2[j-1] {
167+
dp[i][j] = dp[i-1][j-1]
168+
} else {
169+
dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1
170+
}
171+
}
172+
}
173+
return dp[m][n]
174+
}
175+
176+
func min(a, b int) int {
177+
if a < b {
178+
return a
179+
}
180+
return b
181+
}
75182
```
76183

77184
### **...**

solution/0000-0099/0072.Edit Distance/README_EN.md

+100-2
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,119 @@ exection -&gt; execution (insert &#39;u&#39;)
4747
<li><code>word1</code> and <code>word2</code> consist of lowercase English letters.</li>
4848
</ul>
4949

50-
5150
## Solutions
5251

52+
Dynamic programming.
53+
5354
<!-- tabs:start -->
5455

5556
### **Python3**
5657

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

6177
### **Java**
6278

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

67165
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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 = 0; i <= m; ++i) {
7+
dp[i][0] = i;
8+
}
9+
for (int j = 0; j <= n; ++j) {
10+
dp[0][j] = j;
11+
}
12+
for (int i = 1; i <= m; ++i) {
13+
for (int j = 1; j <= n; ++j) {
14+
if (word1[i - 1] == word2[j - 1]) {
15+
dp[i][j] = dp[i - 1][j - 1];
16+
} else {
17+
dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
18+
}
19+
}
20+
}
21+
return dp[m][n];
22+
}
23+
};
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 := 0; i <= m; i++ {
5+
dp[i] = make([]int, n+1)
6+
dp[i][0] = i
7+
}
8+
for j := 0; j <= n; j++ {
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] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 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
@@ -1,15 +1,22 @@
11
class Solution {
22
public int minDistance(String word1, String word2) {
3-
return edit(word1.length(),word2.length(),word1,word2,new int[word1.length()+1][word2.length()+1]);
4-
}
5-
private int edit(int l, int r, String w1, String w2, int[][] dp){
6-
if(l==0) return r;
7-
if(r==0) return l;
8-
if(dp[l][r]!=0) return dp[l][r];
9-
int min = (w1.charAt(l-1)!=w2.charAt(r-1)) ?
10-
Math.min(edit(l-1,r-1,w1,w2,dp)+1,Math.min(edit(l-1,r,w1,w2,dp)+1,edit(l,r-1,w1,w2,dp)+1))
11-
: edit(l - 1, r - 1, w1, w2, dp);
12-
dp[l][r] = min;
13-
return min;
3+
int m = word1.length(), n = word2.length();
4+
int[][] dp = new int[m + 1][n + 1];
5+
for (int i = 0; i <= m; ++i) {
6+
dp[i][0] = i;
7+
}
8+
for (int j = 0; 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] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
17+
}
18+
}
19+
}
20+
return dp[m][n];
1421
}
1522
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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(m + 1):
6+
dp[i][0] = i
7+
for j in range(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] = min(dp[i][j - 1], dp[i - 1]
15+
[j], dp[i - 1][j - 1]) + 1
16+
return dp[-1][-1]

0 commit comments

Comments
 (0)