leetcode 72 编辑距离(动态规划题,类似于求最长公共子序列)

0 阅读1分钟

做这种题,脑子要立刻想到那个二维图,一般当前点由正上方,斜左上方,左边三个点决定,然后给临界边赋值,如第一行,第一列。

image.png 代码Java

class Solution {
    // 从右往左
    // 删除字符(i-1,j) insert(i,j-1)  replace(i-1,j-1)     
    public int minDistance(String word1, String word2) {
        // char[] s1 = word1.toCharArray();
        // char[] s2 = word2.toCharArray();
        // int l1 = s1.length;
        // int l2 = s2.length;
        // int[][] f = new int[l1+1][l2+1];
        // for(int j = 0; j < l2; j++ ) {
        //     f[0][j+1] = j+1;
        // }

        // for(int i = 0; i < l1; i++) {
        //     f[i+1][0] = i + 1;
        //     for(int j = 0; j < l2; j++) {
        //         f[i+1][j+1] = s1[i] == s2[j] ? f[i][j] : 
        //         Math.min(Math.min(f[i][j], f[i][j+1]), f[i+1][j]) + 1; //分别是替换,删除,增加
        //     }
        // }
        // return f[l1][l2];

        char[] s1 = word1.toCharArray();
        char[] s2 = word2.toCharArray();
        int l1 = s1.length;
        int l2 = s2.length;
        int[] f = new int[l2+1];
        for(int j = 0; j < l2; j++ ) {
            f[j+1] = j+1;
        }

        for(int i = 0; i < l1; i++) {
            int pre = f[0];
            f[0] = i + 1; // 等价于 f[i+1][0] = i+1
            for(int j = 0; j < l2; j++) {
                int tmp = f[j+1];
                f[j+1] = s1[i] == s2[j] ? pre : 
                Math.min(Math.min(pre, f[j+1]), f[j]) + 1; //分别是替换,删除,增加
                pre = tmp;
            }
        }
        return f[l2];
    }
}

收起