@@ -51,27 +51,134 @@ exection -> execution (插入 'u')
51
51
<li><code>word1</code> 和 <code>word2</code> 由小写英文字母组成</li>
52
52
</ul >
53
53
54
-
55
54
## 解法
56
55
57
56
<!-- 这里可写通用的实现逻辑 -->
58
57
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
+
59
69
<!-- tabs:start -->
60
70
61
71
### ** Python3**
62
72
63
73
<!-- 这里可写当前语言的特殊实现逻辑 -->
64
74
65
75
``` 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 ]
67
92
```
68
93
69
94
### ** Java**
70
95
71
96
<!-- 这里可写当前语言的特殊实现逻辑 -->
72
97
73
98
``` 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
+ ```
74
150
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
+ }
75
182
```
76
183
77
184
### ** ...**
0 commit comments