'''
两个字符串的编辑距离
edit[i][j]表示A串从第0个字符开始到第i个字符和B串从第0个字符开始到第j个字符,这两个字串的编辑距离。
字符串的下标从1开始。
递推公式:
'michaelab' 变成 'michaelxy'
if b==y:
d[i][j] = d[i-1][j-1]
if b!=y:
添加:michaelaby michaelxy d[i][j] = 1 + d[i][j-1]
删除:michaela michaelxy d[i][j] = 1 + d[i-1][j]
替换:michaelay michaelxy d[i][j] = flag + d[i-1][j-1](就是最后一个字符相等不需要操作,不等就得+1了)
初始矩阵:
d[0][j] 就是j, d[i][0]就是i
'''
def eidt_1(s1, s2):
# 矩阵的下标得多一个
len_str1 = len(s1) + 1
len_str2 = len(s2) + 1
# 初始化了一半 剩下一半在下面初始化
matrix = [[0] * (len_str2) for i in range(len_str1)]
for i in range(len_str1):
for j in range(len_str2):
if i == 0 and j == 0:
matrix[i][j] = 0
# 初始化矩阵
elif i == 0 and j > 0:
matrix[0][j] = j
elif i > 0 and j == 0:
matrix[i][0] = i
# flag
elif s1[i - 1] == s2[j - 1]:
matrix[i][j] = min(matrix[i - 1][j - 1], matrix[i][j - 1] + 1, matrix[i - 1][j] + 1)
else:
matrix[i][j] = min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1)
return matrix[len_str1 - 1][len_str2 - 1]
if __name__ == '__main__':
s1 = 'cfe'
s2 = 'coffe'
res = eidt_1(s1, s2)
print(res)
结果:
2