标签:认识 字母 距离 编辑 range word1 word2 dp
定义f[i][j]为word1前i个字符到word2的前j个字符的转化的最小步。
接着,我们来考虑状态转移方程。
- 假设对于f[i][j]以前的之都已知,考虑fi的情形。
- 若word1[i] = word2[j],那么说明只要word1的前i-1个能转换到word2的前j-1个即可,所以 f[i][j] = f[i-1][j-1]
- 反之,若不等,我们就要考虑以下情形了。
- 给word1插入一个和word2最后的字母相同的字母,这时word1和word2的最后一个字母就一样了,此时编辑距离等于1(插入操作) + 插入前的word1到word2去掉最后一个字母后的编辑距离 f[i][j - 1] + 1
- 删除word1的最后一个字母,此时编辑距离等于1(删除操作) + word1去掉最后一个字母到word2的编辑距离 f[i - 1][j] + 1
- 把word1的最后一个字母替换成word2的最后一个字母,此时编辑距离等于 1(替换操作) + word1和word2去掉最后一个字母的编辑距离。为f[i - 1][j - 1] + 1
- 三者取最小值即可。
pattern, target = "book", "d7fh" m, n = len(pattern), len(target) dp = [[0]*n for _ in range(m)] # dp[i][j]表示第一个字符的前i个字符到第二个前j个字符需要的最小操作数 # word1后面插入一个就和word2相等:word1插入前(i-1)到word2(j)的编辑距离+1,即dp[i-1][j] + 1 # word1和word2删除一个字符相等:word1(i)到word2删除前(j-1)的编辑距离+1,即dp[i][j-1] + 1 # word1和word2替换最后一个字符相等:不产生相对位置移动,只是在各自前一个字符上最小操作数加1,及dp[i-1][j-1] + 1 for i in range(m): dp[i][0] = i for j in range(n): dp[0][j] = j for i in range(m): for j in range(n): if pattern[i] == target[j]: dp[i][j] = dp[i-1][j-1] else: dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1) print(dp[m-1][n-1])
标签:认识,字母,距离,编辑,range,word1,word2,dp 来源: https://www.cnblogs.com/demo-deng/p/16580760.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。