字符串的最小编辑距离以及最小编辑路径

一些基础知识可以从别的博客里找到,这里只提供相应代码

# -*- 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])
    

 

posted @ 2021-09-15 15:36  wbb12  阅读(272)  评论(0)    收藏  举报