HJ52 计算字符串的编辑距离

题目:
HJ52 计算字符串的编辑距离

题解:

定义dp方程,dp[i][j] 表示字符串s1(1-i),到字符串s2(1-j)的编辑距离;

如果s1[i] == s2[j] 证明当前位置的字符相等,无需操作,即dp[i][j] = dp[i-1][j-1];

如果s1[i] != s2[j] 则需要进行修改,有三种修改方式:

1.删除:s1(1 - i-2) 编辑为 s2(1 - j-1) 在删除s1[i-1];

2.插入:s1(1 - i-1) 编辑为 s2(1 - i-2) 再插入s2[j-1];

3.修改:s1(1 - i-2) 编辑为 s2(1 - i-) 再将s1[i-1] 修改为 s2[i-1)

三种修改操作都需要增加一次编辑次数,然后取最小的一个。

dp 初始化:
dp[i][0] 表示s1(1-i)编辑为空,那么需要删除s1的所有字符,即dp[i][0]=i;

同理,dp[0][i]=i;

    public int getDistance(String s1, String s2) {
        int n = s1.length();
        int m = s2.length();
        int[][] dp = new int[n + 1][m + 1];

        for (int i = 1; i < n + 1; i++) {
            dp[i][0] = i;
        }

        for (int i = 1; i < m + 1; i++) {
            dp[0][i] = i;
        }

        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j < m + 1; j++) {
                if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
                }
            }
        }

        return dp[n][m];
    }

时间复杂度:O(n*m)

你可能感兴趣的:(算法,华为,编辑距离)