当前位置:   article > 正文

最小编辑代价_最 编辑代价

最 编辑代价

https://www.nowcoder.com/practice/dfa502cf6a914fb5b98c59c56619e96ctpId=101&tqId=33111&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking

题目描述

给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,请输出将str1编辑成str2的最小代价。

输入描述:

输出三行,第一行和第二行均为一行字符串,分别表示两个字符串str1,str2。(1≤length(str1),length(str2)≤5000)。第三行为三个正整数,代表ic,dc和rc。(1<=ic<=10000、1<=dc<=10000、1<=rc<=10000)

输出描述:

输出一个整数,表示编辑的最小代价。

示例1

输入

abc
adc
5 3 2

输出

2

示例2

输入

abc
adc
5 3 100

输出

8

示例3

输入

abc
abc
5 3 2

输出

0

备注:

时间复杂度O(n∗m),空间复杂度O(n)。(n,m代表两个字符串长度)
  1. //方法1:
  2. //dp[i][j]定义为s1[0..i-1]编辑成s2[0..j-1]的最小代价
  3. //O(mn) O(mn)
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6. int main(){
  7. string s1,s2;
  8. cin>>s1>>s2;
  9. int ic,dc,rc;
  10. cin>>ic>>dc>>rc;
  11. int row=s1.size()+1;
  12. int col=s2.size()+1;
  13. vector<vector<int>> dp(row,vector<int>(col,0));
  14. for(int i=1;i<row;i++){
  15. dp[i][0]=i*dc;
  16. }
  17. for(int j=1;j<col;j++){
  18. dp[0][j]=j*ic;
  19. }
  20. for(int i=1;i<row;i++){
  21. for(int j=1;j<col;j++){
  22. if(s1[i-1]==s2[j-1]){
  23. dp[i][j]=dp[i-1][j-1];
  24. }else{
  25. dp[i][j]=dp[i-1][j-1]+rc;
  26. }
  27. dp[i][j]=min(dp[i][j],dp[i][j-1]+ic);
  28. dp[i][j]=min(dp[i][j],dp[i-1][j]+dc);
  29. }
  30. }
  31. cout<<dp[row-1][col-1]<<endl;
  32. return 0;
  33. }
  1. //方法2:优化空间
  2. //dp[i][j]依赖于dp[i-1][j-1]、dp[i-1][j]、dp[i][j-1]
  3. //O(mn) O(min(m,n))
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6. int main(){
  7. string s1,s2;
  8. cin>>s1>>s2;
  9. int ic,dc,rc;
  10. cin>>ic>>dc>>rc;
  11. //较短的字符串作为列
  12. if(s1.size()<s2.size()){ //s2较长就交换ic和dc的值
  13. swap(ic,dc);
  14. swap(s1,s2); //s1作为行,s2作为列(交换后,s2较短)
  15. }
  16. vector<int> dp(s2.size()+1);
  17. for(int j=1;j<=s2.size();j++){
  18. dp[j]=j*ic;
  19. }
  20. for(int i=1;i<=s1.size();i++){
  21. int pre=dp[0]; //pre表示上一行最左边的值,最开始是未更新的dp[0]
  22. dp[0]=i*dc; //更新当前行的dp[0]
  23. for(int j=1;j<=s2.size();j++){
  24. int tmp=dp[j]; //记录上一行的dp[j]
  25. if(s1[i-1]==s2[j-1]){
  26. dp[j]=pre;
  27. }else{
  28. dp[j]=pre+rc;
  29. }
  30. dp[j]=min(dp[j],dp[j-1]+ic);
  31. dp[j]=min(dp[j],tmp+dc);
  32. pre=tmp; //pre变为上一行的dp[j],是下一次循环的左上角的值
  33. }
  34. }
  35. cout<<dp[s2.size()]<<endl;
  36. return 0;
  37. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50774
推荐阅读
相关标签
  

闽ICP备14008679号