最短编辑距离·动态规划
有字符串An="a1a2a3...an",Bm="b1b2b3...bm"A_n="a_1 a_2 a_3...a_n",B_m="b_1 b_2 b_3...b_m"An="a1a2a3...an",Bm="b1b2b3...bm",通过插入字符、删除字符、替换字符三种操作将两字符串变成相同字符串,最少需要几步操作
设D[An][Bm]D[A_n][B_m]D[An][Bm]为两字符串的最短编辑距离,di[An][Bm]d_i[A_n][B_m]di[An][Bm]为两字符串的编辑距离
分析
因为{An,Bm}\{A_n,B_m\}{An,Bm}存在插入、删除、替换三种操作。对一个字符串的插入操作都是可以在另一个字符串中以删除操作替代而实现相同的编辑效果(让两字符串更相似),因此我们仅以删除与替换操作对字符串进行处理。
所以{An,Bm}\{A_n,B_m\}{An,Bm}上一阶段的可能情形为{An−1,Bm},{An,Bm−1},{An−1,Bm−1}\{A_{n-1},B_{m}\},\{A_{n},B_{m-1}\},\{A_{n-1},B_{m-1}\}{An−1,Bm},{An,Bm−1},{An−1,Bm−1}
an=bma_n=b_man=bm
当an=bma_n=b_man=bm时,即使n≠mn\neq mn=m,D[An][Bm]=D[An−1][Bm−1]D[A_n][B_m]=D[A_{n-1}][B_{m-1}]D[An][Bm]=D[An−1][Bm−1],因为总会有插入或删除操作使得两字符串长度对齐,此时末尾字符相同该位置将不需要操作
{An−1,Bm}\{A_{n-1},B_{m}\}{An−1,Bm}
对字符串AnA_{n}An删除字符ana_nan即可得到{An−1,Bm}\{A_{n-1},B_{m}\}{An−1,Bm},此过程仅需一次删除操作,若已知D[An−1][Bm]D[A_{n-1}][B_m]D[An−1][Bm],则
d1[An][Bm]=D[An−1][Bm]+1
d_1[A_n][B_m]=D[A_{n-1}][B_m]+1
d1[An][Bm]=D[An−1][Bm]+1
{An,Bm−1}\{A_{n},B_{m-1}\}{An,Bm−1}
对字符串BmB_{m}Bm删除字符bmb_mbm即可得到{An,Bm−1}\{A_{n},B_{m-1}\}{An,Bm−1},此过程仅需一次删除操作,若已知D[An][Bm−1]D[A_{n}][B_{m-1}]D[An][Bm−1],则
d2[An][Bm]=D[An][Bm−1]+1
d_2[A_n][B_m]=D[A_{n}][B_{m-1}]+1
d2[An][Bm]=D[An][Bm−1]+1
{An−1,Bm−1}\{A_{n-1},B_{m-1}\}{An−1,Bm−1}且an≠bma_n\neq b_man=bm
字符串组{An,Bm}\{A_n,B_m\}{An,Bm}比{An−1,Bm−1}\{A_{n-1},B_{m-1}\}{An−1,Bm−1}多了两个字符an,bma_n,b_man,bm,则需要一次替换操作将ana_nan替换成bmb_mbm,此时等同于an=bma_n=b_man=bm的情形。若已知D[An−1][Bm−1]D[A_{n-1}][B_{m-1}]D[An−1][Bm−1],则
d3[An][Bm]=D[An−1][Bm−1]+1
d_3[A_n][B_m]=D[A_{n-1}][B_{m-1}]+1
d3[An][Bm]=D[An−1][Bm−1]+1
状态转移方程
- 当an=bma_n=b_man=bm时,D[An][Bm]=D[An−1][Bm−1]D[A_n][B_m]=D[A_{n-1}][B_{m-1}]D[An][Bm]=D[An−1][Bm−1]
- 当an≠bma_n\neq b_man=bm时,D[An][Bm]=min(d1[An][Bm],d2[An][Bm],d3[An][Bm])D[A_n][B_m]=min(d_1[A_{n}][B_m], d_2[A_{n}][B_{m}], d_3[A_{n}][B_{m}])D[An][Bm]=min(d1[An][Bm],d2[An][Bm],d3[An][Bm])
综上所述
D[An][Bm]={min(D[An−1][Bm],D[An][Bm−1],D[An−1][Bm−1])+1,an≠bmD[An−1][Bm−1],an=bm
D[A_n][B_m]=
\left\{\begin{array}{ll}
min(D[A_{n-1}][B_m], D[A_{n}][B_{m-1}], D[A_{n-1}][B_{m-1}])+1, &a_n\neq b_m
\\
D[A_{n-1}][B_{m-1}], &a_n=b_m
\end{array}\right.
D[An][Bm]={min(D[An−1][Bm],D[An][Bm−1],D[An−1][Bm−1])+1,D[An−1][Bm−1],an=bman=bm