编辑距离
1.问题描述
编辑距离指从一个字符串到另一个字符串所需要的编辑次数,包括插入字符
,删除字符
及替换字符
这三种操作。最小编辑距离即从一个字符串到另一个字符串所需要的最小编辑次数。利用编辑距离可以判断两个字符串的相似程度
2. 最小编辑距离计算
我们定义d[i][j]
表示words1
前i
个字符和words2
前j
个字符的最小编辑距离。
则状态转移方程为:
d
p
[
i
]
[
j
]
=
{
d
p
[
i
−
1
]
[
j
]
+
1
d
p
[
i
]
[
j
−
1
]
+
1
d
p
[
i
−
1
]
[
j
−
1
]
+
{
0
w
o
r
d
s
1
[
i
]
=
=
w
o
r
d
s
2
[
j
]
1
w
o
r
d
s
1
[
i
]
≠
w
o
r
d
s
2
[
j
]
dp[i][j]= \begin{cases} dp[i-1][j]+1 \\ dp[i][j-1]+1 \\ dp[i-1][j-1] + \begin{cases} 0 & {words1[i]==words2[j]} \\ 1 & words1[i] \not=words2[j] \end{cases} \end{cases}
dp[i][j]=⎩⎪⎪⎪⎨⎪⎪⎪⎧dp[i−1][j]+1dp[i][j−1]+1dp[i−1][j−1]+{01words1[i]==words2[j]words1[i]=words2[j]
d[i-1][j]
表示words1
前i-1
个字符和words2
前j
个字符的最小编辑距离,对于words1
的第i
个字符来说,只需在words2
后增加一个相同的字符d[i][j-1]
表示words1
前i
个字符和words2
前j-1
个字符的最小编辑距离,对于words2
的第j
个字符来说,只需在words1
后增加一个相同的字符d[i-1][j-1]
表示words1
前i-1
个字符和words2
前j-1
个字符的最小编辑距离,如果words1
的第i
个字符和words2
的第j
个字符不相同,只需将其中一个替换成另一个,反之则不需要进行操作
3. 案例分析——计算字符串的编辑距离
def minDistance(words1: str, words2: str) -> int:
m = len(words1)
n = len(words2)
if m == 0 or n == 0:
return m + n
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m+1):
dp[i][0] = i
for i in range(n+1):
dp[0][i] = i
for i in range(1, m+1):
for j in range(1, n+1):
left = dp[i][j-1] + 1
down = dp[i-1][j] + 1
if words1[i-1] == words2[j-1]:
left_down = dp[i-1][j-1]
else:
left_down = dp[i-1][j-1] + 1
dp[i][j] = min(left, down, left_down)
return dp[m][n]
if __name__=='__main__':
words1 = input()
words2 = input()
print(minDistance(words1, words2))