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