最优编辑

对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。

给定两个字符串AB,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。

测试样例:
"abc",3,"adc",3,5,3,100
返回:8

class MinCost {
public:
    int findMinCost(string A, int n, string B, int m, int c0, int c1, int c2) {
        //dp[i][j]表示将A[0...i-1]转化为B[0...j-1]所需要最少代价,m+1,n+1说明前面需要空串初始值
        int dp[n+1][m+1];
        for(int i=0;i<=n;i++)//删除i个元素
        { //从A(0...i)变换到空字符串"",需要将A中字符全删除,即代价为:c1 * i
            dp[i][0]=i*c1;
        }
        for(int i=0;i<=m;i++)//插入i个元素
        { //从空字符串""变换到B(0...j),x需要添加B字符串中的所有字符,所以代价为:c0 * i
            dp[0][i]=i*c0;
        }
        for(int i=1;i<=n;i++)
         {
            for(int j=1;j<=m;j++)
            {
                int minLen=min(dp[i-1][j]+c1,dp[i][j-1]+c0);
          //当要判断的字符相等则下面表达式中第一个参数为:dp[i][j] = dp[i-1][j-1],否则就要加上c2
          //因为字符是从0开始计数的,所以要减掉1
                if(A[i-1]==B[j-1])
                    minLen=min(minLen,dp[i-1][j-1]);
                else
                    minLen=min(minLen,dp[i-1][j-1]+c2);
                dp[i][j]=minLen;
            }
        }
        return dp[n][m];
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态规划可以用来求解编辑距离问题。编辑距离是指将一个字符串转换为另一个字符串所需的最小字符操作次数。字符操作包括删除一个字符、插入一个字符和将一个字符替换为另一个字符。 为了求解编辑距离,我们可以使用一个二维数组dp,其中dp[i][j]表示将字符串A的前i个字符转换字符串B的前j个字符的最优编辑距离。 我们可以使用以下状态转移方程来计算dp数组的值: 1. 当i=0时,dp[j]表示将空字符串转换字符串B的前j个字符的最优编辑距离,即插入操作的次数,所以dp[j]=j。 2. 当j=0时,dp[i]表示将字符串A的前i个字符转换为空字符串最优编辑距离,即删除操作的次数,所以dp[i]=i。 3. 当A[i-1]=B[j-1]时,这两个字符相等,不需要进行任何操作,所以dp[i][j]=dp[i-1][j-1]。 4. 当A[i-1]!=B[j-1]时,可以进行三种操作:替换操作、插入操作和删除操作。dp[i][j]可以取这三种操作的最小值,即dp[i][j]=min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j])+1。 最后,dp[m][n]即为将字符串A转换字符串B的最优编辑距离,其中m和n分别表示字符串A和字符串B的长度。 以下是使用动态规划解决编辑距离问题的示例代码: ```cpp string a = "sfdqxbw"; string b = "gfdgw"; int dp[MAXN][MAXN]; void solve() { int i, j; for (i = 1; i <= a.length(); i++) dp[i][0 = i; for (j = 1; j <= b.length(); j++) dp = j; for (i = 1; i <= a.length(); i++) { for (j = 1; j <= b.length(); j++) { if (a[i - 1 == b[j - 1]) dp[i][j = dp[i - 1][j - 1]; else dp[i][j = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1; } } } ``` 以上是使用动态规划求解编辑距离问题的方法。通过计算dp数组,我们可以得到将字符串A转换字符串B的最小字符操作次数。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* *2* [动态规划法求解编辑距离问题](https://blog.csdn.net/weixin_42729072/article/details/105160948)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值