问题
存在两个字符串s1:apple,s2:app,现在可以对字符串进行插入、删除、替换三种操作。设计一个算法求解从s1到s2或者s2到s1(两种问题本质相同)的最少操作次数。
方法
对于这个问题可以使用动态规划来处理。
- 递归版本
def edit_distance(s1, s2):
def dp(i, j):
if i == -1:
return j + 1
if j == -1:
return i + 1
if s1[i] == s2[j]:
return dp(i - 1, j - 1)
else:
return min(dp(i - 1, j) + 1, dp(i, j - 1) + 1, dp(i - 1, j - 1) + 1)
return dp(len(s1) - 1, len(s2) - 1)
- 数组版本
import numpy as np
def edit_distance_table(s1, s2):
table = np.zeros((len(s1) + 1, len(s2) + 1), dtype=np.int)
table[0] = np.arange(len(s2) + 1)
table[:, 0] = np.arange(len(s1) + 1)
for i in range(1, len(s1) + 1):
for j in range(1, len(s2) + 1):
if s1[i - 1] == s2[j - 1]:
table[i, j] = table[i - 1, j - 1]
else:
table[i, j] = min(table[i - 1, j] + 1, table[i, j - 1] + 1, table[i - 1, j - 1] + 1)
return table[len(s1), len(s2)]
- 运行结果