不知为啥爆内存, 这是python标准的动态规划解法了。
相较于原始的编辑距离题目(插入,删除,替换代价相同),这道题插入,删除,替换的代价不同。不过难度并没有多大提升。
如果还不会原始题目的动态规划解法,建议先去弄懂(把三种方式的代价固定为1就是原始题目的答案)
看代码:
#
# min edit cost
# @param str1 string字符串 the string
# @param str2 string字符串 the string
# @param ic int整型 insert cost
# @param dc int整型 delete cost
# @param rc int整型 replace cost
# @return int整型
#
class Solution:
def minEditCost(self , str1 , str2 , ic , dc , rc ):
# str1为空时,插入lens2个字符得到str2
# str2为空时,删除lens1个字符得到str1
lens1, lens2 = len(str1), len(str2)
if lens1 == 0: return lens2 * ic
if lens2 == 0: return lens1 * dc
# 初始化dp数组
dp = [[0] * lens2 for _ in range(lens1)]
dp[0][0] = 0 if str1[0] == str2[0] else rc
# str2长度增加时,由str1[0]得到str2需要不断插入
for i in range(1, lens2):
dp[0][i] = dp[0][i-1] + ic
# str1长度增加时, 由str1得到str2[0]需要不断删除
for i in range(1, lens1):
dp[i][0] = dp[i-1][0] + dc
# 主循环
for i in range(1, lens1):
for j in range(1, lens2):
# 两个字符相同时,在dp[i-1][j-1]的基础上不需要代价,否则需要替换一个字符
cost = 0 if str1[i] == str2[j] else rc
dp[i][j] = min(dp[i-1][j-1] + cost, # 在dp[i-1][j-1]的基础上替换/不替换字符
dp[i-1][j] + dc, # 在dp[i-1][j]的基础上删除一个字符
dp[i][j-1] + ic) # 在dp[i][j-1]的基础上插入一个字符
return dp[lens1-1][lens2-1] 
京公网安备 11010502036488号