1. 题目描述
2. 解题思路
动态规划的思想:
(1) 记f[i][j]
为表示使word1[0:i]
、word2[0:j]
相同的最少删除次数;
(2) 当i=0
或j=0
时,动态规划的边界表达式如下所示:
f
[
i
]
[
0
]
=
i
,
if
0
≤
i
≤
n
1
f
[
0
]
[
j
]
=
j
,
if
0
≤
j
≤
n
2
f[i][0]=i, \quad \text{if } 0 \leq i \leq n_1 \\ f[0][j]=j, \quad \text{if } 0 \leq j \leq n_2
f[i][0]=i,if 0≤i≤n1f[0][j]=j,if 0≤j≤n2
(3) 当i>0
且j>0
时,动态规划的表达式如下所示:
f
[
i
]
[
j
]
=
{
f
[
i
−
1
]
[
j
−
1
]
,
if
w
o
r
d
1
[
i
−
1
]
=
w
o
r
d
2
[
j
−
1
]
min
(
f
[
i
−
1
]
[
j
]
,
f
[
i
]
[
j
−
1
]
)
+
1
,
if
w
o
r
d
1
[
i
−
1
]
≠
w
o
r
d
2
[
j
−
1
]
f[i][j] = \begin{cases} f[i - 1][j - 1], & \text{if } word1[i - 1] = word2[j - 1] \\ \min(f[i - 1][j], f[i][j - 1]) + 1, & \text{if } word1[i - 1] \neq word2[j - 1] \end{cases}
f[i][j]={f[i−1][j−1],min(f[i−1][j],f[i][j−1])+1,if word1[i−1]=word2[j−1]if word1[i−1]=word2[j−1]
可以利用1143 最长公共子序列逆向求解。
3. 代码实现
class Solution {
public:
int minDistance(string word1, string word2) {
int n1 = word1.size();
int n2 = word2.size();
vector<vector<int>> f(n1 + 1, vector<int>(n2 + 1));
for (int i = 1; i <= n1; i++) {
f[i][0] = i;
}
for (int j = 1; j <= n2; j++) {
f[0][j] = j;
}
for (int i = 1; i <= n1; i++) {
for (int j = 1; j <= n2; j++) {
if (word1[i - 1] == word2[j - 1]) {
f[i][j] = f[i - 1][j - 1];
} else {
f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1;
}
}
}
return f[n1][n2];
}
};