题解 | #计算字符串的编辑距离#

计算字符串的编辑距离

http://www.nowcoder.com/practice/3959837097c7413a961a135d7104c314

'''
首先构建dp图,以下图为例:

行数为len(oppa)+1,列数为len(apple)+1,加1是因为要考虑 空字符串

第0行中每列值含义:(绿色格子表格)
以第0行第2列为例,表示由 空字符串 变成 'ap' 需要的编辑次数,显然在空字符串中执行两次添加操作即可,所以填2,第0行其他列以此类推

第0列每行的含义:
以第2行第0列为例,表示由 字符串'op' 变成 空字符串 需要的编辑次数,显然对'op'执行两次删除操作即可,所以填2,第0列其他行以此类推

其他空格处含义:
以第2行第4列为例,其代表'op'变'appl'操作
相对于左边空格的'op'变'app'操作上再执行一次添加'l'操作
相对于上边空格的'o'变'appl'操作上再执行一次删除'p'操作
相对于左上角空格的'o'变'app'操作上再执行一次替换'p'变'l'操作

'''

str1=input()# 等价于'oppa'
str2=input()# 等价于'apple'

# 构建bp表格,str1往str2编辑
bp=[[x for x in range(len(str2)+1)] for y in range(len(str1)+1)]
# 现在bp表格中每一行的值为0、1、...len(str2),其中第0行所有值是正确的
# 现在要改变第0列的值为0、1、...len(str1)
for w in range(1,len(str1)):
    bp[w][0]=bp[w-1][0]+1

# 由于第0行和第0列均更新完成,现在要更新其他空格中的值
for j in range(1,len(str1)+1):# 从第表格中的第1行第1列,即bp[1][1]处开始,遍历每一行str1:'oppa'
    for k in range(1,len(str2)+1):# 从第表格中的第1行第1列,即bp[1][1]处开始,遍历每一列
        if str1[j-1]==str2[k-1]:# 当最后一个字符相同时,等价于没有改字符
            bp[j][k]=bp[j-1][k-1]
        elif str1[j-1]!=str2[k-1]:#当最后一个字符不相同时,比较左、上、左上三个位置的值,+1后的找最小值,即最小编辑距离
            add=bp[j][k-1]+1
            delete=bp[j-1][k]+1
            replace=bp[j-1][k-1]+1
            bp[j][k]=min(add, delete, replace)

print(bp[len(str1)][len(str2)])
        


【牛客站内】华为机试题练习记录

全部评论
先忽略最小编辑次数,单纯考虑操作路径,从op到appl,有三种可选的操作路径: 1. (op->app)->appl, 最终编辑次数 = op->app编辑次数 + 1; 2. op->(o->appl), 最终编辑次数 = 1 + o->appl编辑次数; 3. op->(ol->appl等价于o->app), 最终编辑次数 = 1 + o->app编辑次数。 然后把三种操作路径跟表中的状态对应起来应该就比较好理解了,我自己也是想了很久才想通。
7 回复 分享
发布于 2023-07-12 03:54 广东
虽然你讲的很清楚,但是你这代码确实有问题...
点赞 回复 分享
发布于 2022-08-16 10:44
大神,太牛了。我研究这思路都研究了一天。
点赞 回复 分享
发布于 2022-09-01 20:51 广东
另外 老哥我想问下 我可不可以把他理解为add:left/delete:upon/replace:left_upon,在那个bp表中
点赞 回复 分享
发布于 2022-09-10 04:31 英国
很清晰,图加文字很帮助理解
点赞 回复 分享
发布于 2022-07-15 16:34
请问构建dp图是动态规划的通解吗?刷了好几个动态规划题始终没有思路,只记下了每个题的解
点赞 回复 分享
发布于 2022-09-05 00:18 湖南
老哥太牛了,思路超级清晰! 但是老哥可不可以在代码上把两个str的顺序改一改,这样就可以实现算法了
点赞 回复 分享
发布于 2022-09-10 04:29 英国
# 现在要改变第0列的值为0、1、...len(str1) for w in range(1,len(str1)): bp[w][0]=bp[w-1][0]+1 可不可以改为: for w in range(0,len(str1)+1): bp[w][0]=w 即可,因为都是从0到len(str1)
点赞 回复 分享
发布于 2023-03-23 20:36 陕西
最后一行:print(bp[len(str1)][len(str2)]) 会不会是print(bp[len(str1)+1][len(str2)+1])?
点赞 回复 分享
发布于 2023-03-23 20:45 陕西
相对于左上角空格的'o'变'app'操作上再执行一次替换'p'变'l'操作 实际意思: o->app 与 op->appl 相对比: o->app进行 前部分o删除p 后部分app增加l 但因为有替换操作,所以上面两步合并就是:p替换为l
点赞 回复 分享
发布于 2023-05-09 14:54 上海
str1=abcdefgh str2=abc 输出为啥是3?
点赞 回复 分享
发布于 2023-09-04 16:41 陕西

相关推荐

预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
投递华为等公司10个岗位 >
点赞 评论 收藏
分享
牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
98 31 评论
分享
牛客网
牛客企业服务