[LeetCode]Edit Distance
来源:互联网 发布:php api接口开发实例 编辑:程序博客网 时间:2024/06/05 07:55
本题为很明显的DP问题,在存在两个地位等价的对象时(本题中从String1转化成String2,与String2转化成String1是完全相同的),要考虑二维DP。在二维DP中可能向行遍历也可能向列遍历,重要的是要找出循环不变式是什么,当前位置的只需要通过什么样的条件由相邻的、之前的哪些位置通过什么要的运算得到。这里面有一个将具体问题抽象成数学模型的能力。
在本题中,简历二维数组之后,当前位置的值由左、上、左上三个位置的值中较小的那一个加一得到,若是行遍历则是word1新增加的那个字符可由左、上、左上三种状态通过删除该字符、删除word2中新加入的字符、对两字符串中新加入的字符进行替换得到。
但是画一下图会发现,用于存储前序状态的空间可以进行优化,只需要O(m)或者O(n)即可。
另外在对于字符串进行操作中不需要而外判断是否为空,只要在存储前序状态的数组之中增加一个位置,保存word1.length()==0即可。
public class Solution { public int minDistance(String word1, String word2) { if (word1 == null || word2 == null) { return 0; } int[] dp = new int[word2.length() + 1]; for (int i = 0; i < dp.length; i++) { dp[i] = i; } for (int i = 0; i < word1.length(); i++) { // pre的记录是个易错点。外层循环要记录上次循环的DP[0]同时要把DP[0]做初始化 int pre = dp[0]; dp[0] = i + 1; // 注意是i + 1!!!! for (int j = 0; j < word2.length(); j++) { int temp = dp[j + 1]; if (word1.charAt(i) == word2.charAt(j)) { dp[j + 1] = pre; } else { dp[j + 1] = Math.min(dp[j], Math.min(dp[j + 1], pre)) + 1; } pre = temp; } } return dp[word2.length()]; }}
0 0
- LeetCode: Edit Distance
- LeetCode Edit Distance
- LeetCode: Edit Distance
- [Leetcode] Edit Distance
- leetcode 19: Edit Distance
- [LeetCode] Edit Distance
- [Leetcode] Edit Distance
- LeetCode Edit Distance
- [LeetCode] Edit Distance
- [LeetCode]Edit Distance
- Leetcode: Edit Distance
- [leetcode]Edit Distance
- LeetCode-Edit Distance
- [leetcode] Edit Distance
- LeetCode - Edit Distance
- leetcode之Edit Distance
- leetcode edit distance
- 【leetcode】Edit Distance
- 基于TCP的网络编程
- 基于UDP的网络编程
- 【C++】类和对象(构造与析构)
- 【C++】继承(虚基类)
- 【C++】多态性(函数重载与虚函数)
- [LeetCode]Edit Distance
- 《失控》读后感
- 数组中累加和为k的最长子数组长度(算法)
- 单链表
- Android实战简易教程-第五十枪(工具类的测试)
- hdu 5406 CRB and Apple
- HDU——2016 decimal system
- TQ2440 学习笔记—— 14、GPIO 接口【实验:用C语言实现】
- 方法的三个关键参数