问题描述:
由一个字符串转成另一个字符串所需要的最少编辑次数。比如: 字符串 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;
}
}
优化
使用动态规划来解决此问题。