Edit Distance

72. Edit Distance

Algorithm

  • Create a 2D array lookup[i][j]. It's defined as Minimum edit distance between substring of one input string with index from 0 to i - 1 and substring of another input string with index from 0 to j - 1.
  • for lookup[i][j]
    • if a[i - 1] == b[j - 1], we can ignore these two characters and recur for remaining string.
    • if a[i - 1] != b[j - 1], consider three operations to make them same and find minimum.

Code

public class EditDistance {
    private int[][] lookupRecursive;
    public int editDistRecursive(String word1, String word2) {
        char[] a = word1.toCharArray();
        char[] b = word2.toCharArray();
        lookupRecursive = new int[a.length + 1][b.length + 1];
        for (int i = 0; i <= a.length; i++) {
            for (int j = 0; j <= b.length; j++) {
                lookupRecursive[i][j] = -1;
            }
        }
        return helper(a, b, a.length, b.length);
    }

    private int helper(char[] a, char[] b, int lengthA, int lengthB) {
        if (lookupRecursive[lengthA][lengthB] == -1) {
            if (lengthA == 0) {
                lookupRecursive[lengthA][lengthB] = lengthB;
            } else if (lengthB == 0) {
                lookupRecursive[lengthA][lengthB] = lengthA;
            } else if (a[lengthA - 1] == b[lengthB - 1]) {
                lookupRecursive[lengthA][lengthB] = helper(a, b, lengthA - 1, lengthB - 1);
            } else {
                lookupRecursive[lengthA][lengthB] = min(helper(a, b, lengthA - 1, lengthB - 1), // replace
                                                        helper(a, b, lengthA, lengthB - 1), // insert
                                                        helper(a, b, lengthA - 1, lengthB)) + 1; // remove
            }
        }
        return lookupRecursive[lengthA][lengthB];
    }

    private int min(int a, int b, int c) {
        return Math.min(a, Math.min(b, c));
    }

    public int editDistIterative(String word1, String word2) {
        char[] a = word1.toCharArray();
        char[] b = word2.toCharArray();
        int[][] lookupIterative = new int[a.length + 1][b.length + 1];
        for (int i = 0; i <= a.length; i++) {
            for (int j = 0; j <= b.length; j++) {
                if (i == 0) {
                    lookupIterative[i][j] = j;
                } else if (j == 0) {
                    lookupIterative[i][j] = i;
                } else if (a[i - 1] == b[j - 1]) {
                    lookupIterative[i][j] = lookupIterative[i - 1][j - 1];
                } else {
                    lookupIterative[i][j] = min(lookupIterative[i - 1][j - 1], // replac
                                          lookupIterative[i][j - 1], // insert
                                          lookupIterative[i - 1][j]) + 1; // delete
                }
            }
        }
        return lookupIterative[a.length][b.length];
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,354评论 0 33
  • 转眼间的功夫,22天行动营就要结束了,从刚入营时的犹豫不决,到现在d的留恋,我看到了小伙伴们的成长,也看...
    Aaron_c4dc阅读 1,675评论 0 0
  • 1 昨天的那场大火 让好多人不能有个痛快的假期 在车棚里遇到的老王诅咒道:为何没有烧光? 心里有怨气怒火的人绝不止...
    利君理疗阅读 1,801评论 0 0
  • 也许只是一瞬间 就错过了千万个你 是不是有的时候会觉得,微信上没有人找你聊天,好像所有人都不在乎你不搭理你一样。但...
    时时时时光吖阅读 1,427评论 0 3
  • 以前做什么都不愿意想的太多,总觉得时间还长,未来还远,大概是高中的时候就觉得醉生梦死就可以逃避所有面临的问题,我喜...
    妖精路过你的世界阅读 2,481评论 2 2

友情链接更多精彩内容