最短编辑距离
如何用许可的编辑方法,经过最小次数(距离)地编辑a串,使a串变成b串?
例如a="linszesze",b="lszlsz"。
lnszesze(删除i),
编辑距离为4。如果每种编辑方法都需要消耗一定的代价,那最短编辑距离问题
就变成最小编辑代价问题。
设串a和串b分别表示为strA和strB。
编辑方法:
替换串a第i个字符记为:strSubstitute(strA,i),代价为costSubstitute。
添加串a第i个字符记为:strInsert(strA,i),代价为costInsert。
删除串a第i个字符记为:strDelete(strA,i),代价为costDelete。
从a串到b串的编辑方法记为:
公式a
str*可为任意许可的编辑方法。
从a串到b串的编辑代价记为:
公式b
目标最小编辑代价:minCost(strA,strB) = minimun{costEdit(strA,strB)},
其对应的编辑方法记为:minEdit(strA,strB)。
对于两个长串,很难作出最小代价编辑方法判断。对串进行添加和删除后,
串中的字符坐标就可能发生化。那么,有没有方法先将一个长串转换成更
小的串,然后再利用这个小的串的解来对长串求解?
为了适应从小串到长串的求解分析,串的表示方法也可以记为:
strA串的第i个字符表示为:
strA(lowA,lowA)和strB(lowB,lowB)。
a串转换成b串时,a串可以分割为两部分strA
更新:2013-11-08
//
问题
有两个字符串a和b。现在对这两个字符串的许可编辑方法有:一、将一个字
符替换成另一个字符,二、添加一个字符、三、删除一个字符。如何用许可的编辑方法,经过最小次数(距离)地编辑a串,使a串变成b串?
例如a="linszesze",b="lszlsz"。
lnszesze(删除i),
lszesze(删除i),
lszlsze(替换e为l),
lszlsz(删除e)。编辑距离为4。如果每种编辑方法都需要消耗一定的代价,那最短编辑距离问题
就变成最小编辑代价问题。
分析
设串a和串b分别表示为strA和strB。
编辑方法:
替换串a第i个字符记为:strSubstitute(strA,i),代价为costSubstitute。
添加串a第i个字符记为:strInsert(strA,i),代价为costInsert。
删除串a第i个字符记为:strDelete(strA,i),代价为costDelete。
从a串到b串的编辑方法记为:
公式a
edit(strA,strB) = str*(strA,i)+...+str*(strA,j);
这里的+号不是数学的加,是编辑的步骤的累加。str*可为任意许可的编辑方法。
从a串到b串的编辑代价记为:
公式b
cost(edit(strA,strB)) = cost*+...+cost*; //cost*可为对应str*方法的代价
因为用不同的编辑方法,cost(edit(strA,strB))就可能不同,所以,目标最小编辑代价:minCost(strA,strB) = minimun{costEdit(strA,strB)},
其对应的编辑方法记为:minEdit(strA,strB)。
对于两个长串,很难作出最小代价编辑方法判断。对串进行添加和删除后,
串中的字符坐标就可能发生化。那么,有没有方法先将一个长串转换成更
小的串,然后再利用这个小的串的解来对长串求解?
为了适应从小串到长串的求解分析,串的表示方法也可以记为:
strA = strA(lowA,highA);
lowA和highA分别为串的第一个字符的下标和最后一个字符的下标。strA串的第i个字符表示为:
strA[i];
从a串转换到b串的最小编辑代价表示为:
minCost(strA(lowA,highA), strB(lowB,highB));
3尝试求解
现在尝试对a串和b串的转换做一种规模划分。假设有strA(lowA,lowA)和strB(lowB,lowB)。
a串转换成b串时,a串可以分割为两部分strA