最短编辑距离·动态规划

本文介绍了最短编辑距离的概念,通过动态规划方法解决将字符串An转换为Bm的最少操作步数问题。分析了三种操作(删除、插入、替换)的影响,并给出了状态转移方程。当字符匹配时,距离等于前一阶段距离;不匹配时,通过比较删除、插入和替换的操作成本取最小值作为当前距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最短编辑距离·动态规划

有字符串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}\}{An1,Bm},{An,Bm1},{An1,Bm1}

an=bma_n=b_man=bm

an=bma_n=b_man=bm时,即使n≠mn\neq mn=mD[An][Bm]=D[An−1][Bm−1]D[A_n][B_m]=D[A_{n-1}][B_{m-1}]D[An][Bm]=D[An1][Bm1],因为总会有插入或删除操作使得两字符串长度对齐,此时末尾字符相同该位置将不需要操作

{An−1,Bm}\{A_{n-1},B_{m}\}{An1,Bm}

对字符串AnA_{n}An删除字符ana_nan即可得到{An−1,Bm}\{A_{n-1},B_{m}\}{An1,Bm},此过程仅需一次删除操作,若已知D[An−1][Bm]D[A_{n-1}][B_m]D[An1][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[An1][Bm]+1

{An,Bm−1}\{A_{n},B_{m-1}\}{An,Bm1}

对字符串BmB_{m}Bm删除字符bmb_mbm即可得到{An,Bm−1}\{A_{n},B_{m-1}\}{An,Bm1},此过程仅需一次删除操作,若已知D[An][Bm−1]D[A_{n}][B_{m-1}]D[An][Bm1],则
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][Bm1]+1

{An−1,Bm−1}\{A_{n-1},B_{m-1}\}{An1,Bm1}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}\}{An1,Bm1}多了两个字符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[An1][Bm1],则
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[An1][Bm1]+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[An1][Bm1]
  2. 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[An1][Bm],D[An][Bm1],D[An1][Bm1])+1,D[An1][Bm1],an=bman=bm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值