13.9 Edit Distance

来源:互联网 发布:java 防止 sql注入 编辑:程序博客网 时间:2024/06/06 05:34

Link: https://oj.leetcode.com/problems/edit-distance/

Below is my 1st attempt. But has errors. 

public class Solution {    public int minDistance(String word1, String word2) {        if(word1 == null && word2 == null) return 0;        int m = word1.length();        int n = word2.length();        int[][] f = new int[m][n];        for(int i = 0; i < m; i++){            for(int j = 0; j < n; j++){                int score = word1.charAt(i) == word2.charAt(j) ? 1 : 0;                f[i][j] = Math.min(Math.min(f[i-1][j], f[i][j-1])+1, f[i-1][j-1] + score);            }        }        return f[m-1][n-1];    }}


Approach I: correct answer

Time: O(mn), Space: O(mn)

public class Solution {    public int minDistance(String word1, String word2) {        if(word1 == null && word2 == null) return 0;        int m = word1.length();        int n = word2.length();        int[][] f = new int[m+1][n+1];        //init the first row        for(int j = 0; j <=n; j++){            f[0][j] = j;        }        //init the first col        for(int i = 0; i <=m; i++){            f[i][0] = i;        }        //fill in the middle        for(int i = 1; i <=m; i++){            for(int j = 1; j <=n; j++){                if(word1.charAt(i-1) == word2.charAt(j-1)){                    f[i][j] = f[i-1][j-1];//why don't need to compare with Math.min(f[i-1][j], f[i][j-1])+1 here?                }                 else{                    f[i][j] = Math.min(Math.min(f[i-1][j], f[i][j-1]), f[i-1][j-1])+1;                }            }        }        return f[m][n];    }}

Approach II: DP with two arrays 

Since f[i][j] come from f[i-1][j-1], f[i][j-1] and f[i-1][j], we cannot use one array to store it. So we create two arrays. One to store the current row, the other to store the previous row. 

Time: O(mn), Space: O(min(m, n))

public class Solution {    public int minDistance(String word1, String word2) {        if(word1 == null && word2 == null) return 0;        int m = word1.length();        int n = word2.length();        int[] f = new int[n+1];        //init the first row        for(int j = 0; j <=n; j++){            f[j] = j;        }        //fill in the middle        for(int i = 1; i <=m; i++){            int[] newF = new int[n+1];            newF[0] = i;            for(int j = 1; j <=n; j++){                if(word1.charAt(i-1) == word2.charAt(j-1)){                    newF[j] = f[j-1];                }                 else{                    newF[j] = Math.min(Math.min(f[j], newF[j-1]), f[j-1])+1;                }            }            f = newF;        }        return f[n];    }}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为麦芒5主屏页面不显示怎么办 6s p换屏幕原装太贵怎么办 4g手机开不开机黑屏怎么办 华为麦芒5 4g信号差怎么办 华为麦芒手机锁屏密码忘了怎么办 华为麦芒5相机拍相片倒了怎么办 红米5a开不了机怎么办 华为沾了海水打不开机怎么办 华为麦芒手机忘记锁屏密码怎么办 华为手机的方框键摁不了怎么办 笔记本自动更新到一半太慢了怎么办 华为麦芒5音量下键乱跑了怎么办 麦芒6手机QQ视频没声音怎么办 18:9看16:9黑边怎么办 华为畅享7s声音小怎么办 华为畅享8手机声音小怎么办 华为畅享8plus声音小怎么办 荣耀7x锁屏密码忘记怎么办 华为荣耀7x锁屏密码忘记了怎么办 苹果耳机进水后声音变了怎么办 华为荣耀开了数据用不了怎么办 华为手机高德地图信号弱怎么办? 手机QQ浏览器看视频有广告怎么办 手机显示网络连接但不可上网怎么办 华为手机关机后开不了机怎么办 华为畅享8p相机拍照模糊怎么办 手机触屏不准怎么办荣耀青春版九 华为手机锁屏手势密码忘了怎么办 荣耀手机锁屏密码忘了怎么办 华为p20隐私空间密码忘了怎么办 安全管家隐私保护的密码忘了怎么办 华为手机自带截图键删除了怎么办 飞科电吹风吹一会就断电怎么办 住酒店时电吹风吹坏了怎么办 把话费充到停机的号码上去了怎么办 电信手机卡充值了还停机怎么办 电信手机一直没用却欠费了怎么办 苹果se开起4g信号不好怎么办 触屏华为手机充不了电怎么办 华为手机自拍出来的字反向怎么办 华为微信隐藏了怎么弄出来怎么办