编辑距离

问题描述:

由一个字符串转成另一个字符串所需要的最少编辑次数。比如: 字符串 A:a  字符串B:b, 由字符串A转换成B只需要一次

操作,即把a 换成b即可。


操作方法:

1. 修改一个字符:   abc => adc  只需要将b改成d即可

2. 增加一个字符:   ab => abc 只需要增加c即可

3. 删除一个字符:   abc => ac  只需删除b


解决方案:

目前,需要找到最小的编辑距离,即最小编辑次数。例如: abc  =》 adbcf :第一步,可以删除d, 也可以修改d为b等。

通过递归,很容易解决这个问题。

int edit_dis(char *lbegin, char *lend,
             char *rbegin, char *rend)
{
    if (lbegin > lend)
    {
        if (rbegin > rend)
            return 0;
        else
            return rend - rbegin + 1;
    }
    else if (rbegin > rend)
    {
        return lend - lbegin + 1;
    }
    
    if (*lbegin == *rbegin)
    {
        return edit_dis(lbegin+1, lend, rbegin+1, rend);
    }
    else
    {   
        /* 相对于 l string ,即lbegin ~ lend的删除,替换,增加 */
        int t1 = edit_dis(lbegin+1, lend, rbegin+1, rend);  // 替换
        int t2 = edit_dis(lbegin+1, lend, rbegin, rend);    // 删除
        int t3 = edit_dis(lbegin, lend, rbegin+1, rend); // 增加
        
        return min(t1, t2, t3) + 1;
    }
    
    
}
          

优化

使用动态规划来解决此问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值