对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。
给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。
测试样例:
"abc",3,"adc",3,5,3,100
返回:8
对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。
给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。
"abc",3,"adc",3,5,3,100
返回:8
# -*- coding:utf-8 -*- #分析: #dp[i][j]代表用 str1[0~i-1]编辑乘str2[0~j-1]的最小代价 #分析简单情况: #dp[0][j]:即把一个空串编辑乘str2[0~j-1]的代价则即将j个字符全部插入即 #dp[0][j] = j*c0; #dp[i][0]:即把str1[0~i-1]编辑乘空串的代价,即将i个字符全部删除即 #dp[i][0] = i*c1 #dp[i][j]:分四种情况: #1) 先把str1[0~i-1]编辑成str1[0~i-2],在把str1[0~i-2]编辑成str2[0~j-1] #dp[i][j] = dp[i-1][j] + c1; #2) 先把str1[0~i-1]编辑成str2[0~j-2],在把str2[0~j-2]编辑成str2[0~j-1] #dp[i][j] = dp[i][j-1] + c0; #3) 如果str1[i-1] != str2[j-1],则可以先将str1[0~i-2]编辑成str2[0~j-2],然后进行替换 #dp[i][j] = dp[i-1][j-1] + c2; #4) 如果str1[i-1] == str2[j-1],则直接将str1[0~i-2]编辑成str2[0~j-2] #dp[i][j] = dp[i-1][j-1] #从以上情况中选择代价最小的一种情况 class MinCost: def findMinCost(self, A, n, B, m, c0, c1, c2): dp=[[0 for i in range(m+1)]for i in range(n+1)] for i in range(n+1):#初始化dp[0][j] dp[i][0]=i*c1 for j in range(m+1):#初始化dp[i][0] dp[0][j]=j*c0 for i in range(1,n+1):#其他情况 for j in range(1,m+1): dp[i][j]=min(dp[i-1][j]+c1,dp[i][j-1]+c0) if A[i-1]==B[j-1]: dp[i][j]=min(dp[i-1][j-1],dp[i][j]) else: dp[i][j]=min(dp[i-1][j-1]+c2,dp[i][j]) return dp[n][m]