字符串的最小编辑距离以及最小编辑路径
一些基础知识可以从别的博客里找到,这里只提供相应代码
# -*- coding: utf-8 -*- ""” @author: wbb """ def normal_leven(str1, str2,c): len_str1 = len(str1) + 1 len_str2 = len(str2) + 1 #create matrix matrix = [[0 for n in range(len_str1)] for n in range(len_str2 )] #init x axis #print(matrix) for i in range(len_str1): matrix[0][i] = i #print(matrix) #init y axis for j in range(len_str2): matrix[j][0] = j #print(matrix) for i in range(1, len_str2): for j in range(1, len_str1): if str1[j-1] == str2[i-1]: cost = 0 else: cost = c matrix[i][j] = min(matrix[(i-1)][j]+1, matrix[i][(j-1)]+1, matrix[(i-1)][(j-1)] + cost) return matrix a=input('请输入第一个字符:') b=input('请输入第二个字符:') cost=int(input('请输入替换操作代价:')) dp=normal_leven(a,b,cost) print('最小编辑距离为:',dp[-1][-1]) #每个操作代价都为1 print('最小代价表',dp) #实现路径回溯 i , j= len(b), len(a) op_list = [] # 记录编辑操作 while i> 0 or j> 0: if dp[i][j] == dp[i-1][j-1] + cost : op_list.append('change [ {} ] to [ {} ]'.format(b[i-1], a[j-1])) i, j = i-1, j-1 continue if dp[i][j] == dp[i-1][j] + 1: op_list.append('remove [ {} ]'.format(b[i-1])) i, j = i-1, j continue if dp[i][j] == dp[i][j-1] + 1: op_list.append('insert [ {} ]'.format(a[j-1])) i, j = i, j-1 continue if dp[i][j] ==dp[i-1][j-1] and b[i-1]==a[j-1]: op_list.append('keep [ {} ]'.format(b[i-1])) i, j = i-1, j-1 print('最小编辑路径:') for i in range(len(op_list)): print(op_list[len(op_list)-i-1])

浙公网安备 33010602011771号