[python]leetcode(72). Edit Distance AND (583). Delete Operation for Two Strings
来源:互联网 发布:快乐大本营知乎 编辑:程序博客网 时间:2024/06/05 17:09
problem
Given two words word1 and word2, find the minimum number of steps
required to convert word1 to word2. (each operation is counted as 1
step.)You have the following 3 operations permitted on a word:
a) Insert a character b) Delete a character c) Replace a character
solution
只允许三种修改方式:
- 删除一个字符
- 插入一个字符
- 替换一个字符
问题1:
class Solution(object): def minDistance(self, word1, word2): m = len(word1) n = len(word2) arr = [[0]*(n+1) for _ in range(m+1)] for i in range(m+1): arr[i][0] = i for i in range(n+1): arr[0][i] = i for i in range(1, m+1): for j in range(1, n+1): t = 0 if word1[i-1] == word2[j-1] else 1 arr[i][j] = min(arr[i-1][j-1]+t, arr[i-1][j]+1, arr[i][j-1]+1) return arr[m][n]
问题2:
class Solution(object): def minDistance(self, word1, word2): m = len(word1) n = len(word2) arr = [[0]*(n+1) for _ in range(m+1)] for i in range(m+1): arr[i][0] = i for i in range(n+1): arr[0][i] = i for i in range(1, m+1): for j in range(1, n+1): t = 0 if word1[i-1] == word2[j-1] else 2 #唯一的修改 arr[i][j] = min(arr[i-1][j-1]+t, arr[i-1][j]+1, arr[i][j-1]+1) return arr[m][n]
总结
这个问题给我的思考在于它和最长公共子序列之间的关系,在这个问题中,允许插入、删除和替换。而在最长公共子序列中可以看做是只允许删除的编辑距离,不同的编辑方式只是在递推方程中有所区别而已,核心的方法只是当前两个字符串可以由哪两个字符串编辑而来。也就是知道如何写出递推方程。
另一个需要注意的地方就是要证明最优子结构性质,这个其实比较好理解,因为原问题编辑距离最小的时候,对应的编辑距离最短的子问题一定是最优的。
例如,对’abc’和’abb’之间的编辑距离来说,它们可以由:
- ‘ab’, ‘abb’
- ‘abc’, ‘ab’
- ‘ab’, ‘ab’(相当于其中一个替换最后一个字符 )
这三个子问题推出,原问题最优时一定对应子问题最优的时候,所以满足最优子结构性质。
因此,我们可以使用动态规划解法解决。
更多
阅读全文
0 0
- 【JZOJ 5358】【NOIP2017提高A组模拟9.12】BBQ
- 防火墙搭建及NET机制
- 搜索引擎【渗透神器系列】
- ECJSON格式化工具
- IPython notebook(Jupyter notebook)指定IP和端口运行
- [python]leetcode(72). Edit Distance AND (583). Delete Operation for Two Strings
- JAVA反射机制详解
- Tomcat启动过程原理详解
- java语言基础(88)——多线程(实现多线程的四种方式)
- 招行信用卡笔试编程题 — 考察树的节点个数C++
- poj 1364 King (差分约束 spfa)
- 元组与字典的一些方法
- 记ActiveMQ部署后 Service Unavailable问题解决
- PHP引擎php.ini参数优化