经典dp

基本介绍

Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric)。我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个字符(比如修改、插入、删除)所需要的最少次数。俄罗斯科学家Vladimir Levenshtein于1965年提出了这一概念。

转移方程

$$lev{A,B}(i,j) = begin{cases} i &, j = 0 j &, i = 0 minbegin{cases} lev{a,b}(i, j-1) + 1 lev{a,b}(i-1, j) + 1 lev{a,b}(i-1,j-1)+1,(a_i ne b_i) end{cases} &, otherwise end{cases}$$

Python实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def (str_a, str_b):
def charAt(s, i):
return s[i-1]

dp = [[0]*(len(str_b)+1) for _ in range(len(str_a)+1)]

for i in range(1, len(str_a)+1):
dp[i][0] = i

for i in range(1, len(str_b)+1):
dp[0][i] = i

for i in range(1, len(str_a)+1):
for j in range(1, len(str_b)+1):
if charAt(str_a, i) == charAt(str_b, j):
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])+1

return dp[len(str_a)][len(str_b)]

参考

  1. 字符串编辑距离(Levenshtein距离)算法