编辑距离

问题描述:

由一个字符串转成另一个字符串所需要的最少编辑次数。比如: 字符串 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;
    }
    
    
}
          

优化

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


你可能感兴趣的:(编辑距离)