最小编辑代价
题意分析:
题解一(动态规划):
最优子结构:设输入序列为和,长度分别为m和n。
假设为两个序列和在位置和位置的最短编辑数。
如果两个序列的最后一个字符相等(或),则
如果两个序列的最后一个字符不相等(),则有三种选择:取三种选择最小操作数
如有序列“AGAB” 和“GXAYB”。
它们最后一个字符相等
再考虑“AGA” 和“GXAY“,他们最后一个字符并不相等。
按照上面这种递归,数据量大就会超时,自底向上书写代码。
当其中一个序列长度为0时,编辑距离明显是到达他的长度。
当当前位置字符相等时候,编辑距离
当当前位置字符不相等时候,编辑距离
如图所示,计算过程
图所示为子顶向下的计算过程。
int minEditCost(string str1, string str2, int ic, int dc, int rc) { int m = str1.length(),n = str2.length(); int dp[m+1][n+1]; for(int i=0;i<=m;++i) { for(int j=0;j<=n;++j) { if(i==0) { dp[i][j] =j*ic; } else if(j==0){ dp[i][j]=i*dc; } else if(str1[i-1]==str2[j-1]){ dp[i][j] = dp[i-1][j-1]; } else { dp[i][j] = min({dp[i-1][j]+dc,dp[i-1][j-1]+rc,dp[i][j-1]+ic}); } } } return dp[m][n]; }
时间复杂度:,mn分别为两个字符串的长度
空间复杂度: