[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
原创粉丝点击