📜  编辑距离| DP使用备忘(1)

📅  最后修改于: 2023-12-03 15:11:43.103000             🧑  作者: Mango

编辑距离 | DP使用备忘

简介

编辑距离(Edit Distance),又称Levenshtein距离,是指将一个字符串转换成另一个字符串所需的最少操作次数。其中,操作包括插入、删除、替换字符。

在字符串匹配、语音识别、自然语言处理等领域都有广泛的应用。

动态规划(Dynamic Programming,DP)是解决编辑距离问题的一种常见的算法思路。在此,介绍一些DP思路中使用的备忘录(Memoization)。

DP求解编辑距离

编辑距离问题可以理解为一个二维网格的矩阵,其中行和列分别对应于需要转换成的两个字符串。

设第一个字符串为s,其长度为m;第二个字符串为t,其长度为n。DP求解编辑距离的思路是对每个单元格(i,j)求出从s的前i个字符到t的前j个字符的编辑距离。设f[i][j]表示s的前i个字符转换成t的前j个字符所需的最小编辑距离。则有以下DP方程:

if i=0 or j=0, f[i][j] = max(i, j)
else if s[i] == t[j], f[i][j] = f[i-1][j-1]
else f[i][j] = min(f[i-1][j-1], f[i][j-1], f[i-1][j]) + 1

上式中,当i=0或j=0时,f[i][j]即为剩余字符数量较多的字符串的长度。在此基础上,比较字符串中i和j位置的字符是否相同,确定转换方式。

最终,f[m][n]即为所求的编辑距离。

DP使用备忘

在DP中,备忘录是一种常见的技术手段。它基于记忆化搜索思路,将已经计算出的结果存储起来,避免重复计算。

给出一个使用备忘录的DP实现。此实现使用两个备忘表,f[][]表示DP状态,visit[][]表示备忘记录。初始状态为visit[i][j] = false,表示当前状态未被访问;f[0][j]和f[i][0]的初始状态根据上述DP方程确定。

public class EditDistance {
    private int[][] f; // DP状态表
    private boolean[][] visit; // 备忘表
    
    public int getEditDistance(String s, String t) {
        f = new int[s.length() + 1][t.length() + 1];
        visit = new boolean[s.length() + 1][t.length() + 1];
        
        // 初始化DP状态表
        for (int i = 0; i <= s.length(); i++) {
            f[i][0] = i;
        }
        for (int j = 0; j <= t.length(); j++) {
            f[0][j] = j;
        }
        
        return dp(s, t, s.length(), t.length());
    }
    
    private int dp(String s, String t, int i, int j) {
        if (visit[i][j]) {
            return f[i][j];
        }
        if (i == 0 || j == 0) {
            return f[i][j];
        }
        int res;
        if (s.charAt(i-1) == t.charAt(j-1)) {
            res = dp(s, t, i-1, j-1);
        } else {
            res = 1 + Math.min(dp(s, t, i-1, j-1),
                               Math.min(dp(s, t, i, j-1),
                                        dp(s, t, i-1, j)));
        }
        f[i][j] = res;
        visit[i][j] = true;
        return res;
    }
}

此实现将两个备忘表作为类变量,通过递归实现备忘。对于已经计算出的状态,备忘表visit[][]标记为true,DP状态表f[][]直接返回已有值。对于未计算的状态,按照上述DP递归计算,并将计算结果存入f[][]和visit[][]。

总结

编辑距离问题,是经典的字符串匹配领域的算法问题之一。DP思路是解决编辑距离问题的常用方法,备忘录技术可以提高DP算法的效率。

此备忘录DP实现,将备忘表和状态表分别保存,通过递归实现备忘。在此基础上,可以进一步优化备忘和状态的管理方式,以提高DP算法的效率。