行编辑距离Edit Distance——动态规划
来源:互联网 发布:网络语开车的意思 编辑:程序博客网 时间:2024/05/16 19:17
题目描述:
给定一个源串和目标串,能够对源串进行如下操作:
1. 在给定位置上插入一个字符
2. 替换任意字符
3. 删除任意字符
写一个程序,返回最小操作数,使得对源串进行这些操作后等于目标串,源串和目标串的长度都小于2000。
思路:
设状态dp[i][j] 表示从源串s[0...i] 和 目标串t[0...j] 的最短编辑距离
边界为:dp[i][0] = i,dp[0][j] = j
递推方程:
- 如果s[i] == t[j], 那么 dp[i][j] = dp[i-1][j-1]
- 如果s[i] != t[j],那么有三种操作情况:
将s[i]删除,dp[i][j] = dp[i-1][j] + 1;
将s中添加t[j],dp[i][j] = dp[i][j-1] +1;
将s和t进行替换,dp[i][j] = dp[i-1][j-1] +1;
因此,可以写出状态转移方程:
dp[i][j] = min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1] + (s[i]==t[j] ? 0 :1))
分别对应:删除、添加、替换(若相等就不替换)
代码:
class Solution {public: int minDistance(string word1, string word2) { int Slen = word1.size(); int Tlen = word2.size(); int dp[Slen+1][Tlen+1] = {0};//注意:这里都+1,并且初始化为0 //长度为n的字符串有n+1个隔板 for(int i=1; i<=Slen; i++) //注意从1开始 dp[i][0] = i; for(int j=1; j<=Tlen; j++) dp[0][j] = j; for(int i=1; i<=Slen; i++) { for(int j=1; j<=Tlen; j++) { if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1]; else { int temp = min(dp[i-1][j], dp[i][j-1]); dp[i][j] = min(temp, dp[i-1][j-1]) + 1; } } } return dp[Slen][Tlen]; }};
1 1
- 行编辑距离Edit Distance——动态规划
- [动态规划-3] 编辑距离-Edit Distance
- [LeetCode] [动态规划] [编辑距离] Edit Distance
- LeetCode-Edit Distance 编辑距离与动态规划
- 编辑距离(Edit Distance)的动态规划算法
- 动态规划之编辑距离(Edit Distance)
- [LeetCode 72] Edit Distance(编辑距离/动态规划/DP)
- leetcode 72. Edit Distance DP动态规划 + 编辑距离
- edit distance 编辑距离
- 编辑距离 (edit distance)
- 编辑距离 (edit distance)
- Edit Distance 编辑距离
- edit distance 编辑距离
- Edit Distance 编辑距离
- 编辑距离 (Edit distance)
- 编辑距离 (edit distance)
- Edit Distance(编辑距离)
- 13.9—动态规划—Edit Distance
- DOCKER INSTALL
- 验证scala.math.random生成的随机数是均匀分布的
- Binary Tree Postorder Traversal -- leetcode
- 设计模式之九:建造者模式(Builder)
- 《Java从入门到精通》第四章学习笔记
- 行编辑距离Edit Distance——动态规划
- 输入输出之File类的使用(一)
- 图片上传问题总结
- return 0与1 的区别
- U-boot and Flash (NOR, NAND & SPI)
- 什么是bin文件?
- 收藏网站
- 暴力搜索解0-1背包问题
- java 连接 mysql 的 步骤