leetcode 72. Edit Distance
2016-04-16 11:33
302 查看
参考:/article/1532233.html
状态转移方程为:
dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j] + 1, dp[i][j - 1] + 1) if(word1[i - 1] == word2[j - 1])
dp[i][j] = min(dp[i - 1][j - 1] + 1, dp[i - 1][j] + 1, dp[i][j - 1] + 1) if(word1[i - 1] != word2[j - 1])
题意
求word1变成word2的最短编辑距离。(插入、删除、修改都记为一步操作)题解
使用动态规划解决。dp[i][j] 表示word1子串(0~i-1)变成word2子串(0~j-1)所需的最短编辑距离。状态转移方程为:
dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j] + 1, dp[i][j - 1] + 1) if(word1[i - 1] == word2[j - 1])
dp[i][j] = min(dp[i - 1][j - 1] + 1, dp[i - 1][j] + 1, dp[i][j - 1] + 1) if(word1[i - 1] != word2[j - 1])
代码
class Solution { public: int minDistance(string word1, string word2) { int len1 = word1.length(), len2 = word2.length(); if(len2 == 0 || len1 == 0) return max(len1, len2); int dp[len1 + 1][len2 + 1]; for(int i = 0; i <= len1; i++) dp[i][0] = i; for(int j = 0; j <= len2; j++) dp[0][j] = j; for(int i = 1; i <= len1; i++) { for(int j = 1; j <= len2; j++) { int curDis; if(word1[i - 1] == word2[j - 1]) curDis = dp[i - 1][j - 1]; else curDis = dp[i - 1][j - 1] + 1; curDis = min(curDis, dp[i - 1][j] + 1); // word1 delete word1[i] curDis = min(curDis, dp[i][j - 1] + 1); // word1 insert word2[j] dp[i][j] = curDis; } } return dp[len1][len2]; } };
相关文章推荐
- 关于iOS内购
- 模型,保存数据到数据库
- CSS------添加注释框
- 如何查询ip上所绑定的域名
- R笔记
- linux中萌翻了的cowsay命令
- 浙大 PAT Advanced level 1005. Spell It Right
- listview中item 有checkbox多选防止滑动 listview页面 出现checkbox错位问题
- 自然语言处理工具
- ORACLE数据库用户账号处于expired状态如何处理
- Java多线程学习
- window用ssh连接本机虚拟机中的ubuntu
- java之网络编程
- zy-《挑战》学习笔记
- [小木虫]推荐几个机器学习算法及应用领域相关的中国大牛
- LeetCode *** 274. H-Index
- HDU 1021 Fibonacci Again(斐波那契数列+mod规律)
- LATEX公式语法
- Unity3D教程宝典之 AnimationCurve
- Android5.0新特性:RecyclerView实现上拉加载更多