美文网首页
编辑距离 Edit Distance

编辑距离 Edit Distance

作者: sunblog | 来源:发表于2018-03-13 00:23 被阅读0次

    简介请点击leetcode 这里

    这道题是动态规划。
    动态规划的核心思想是缓存。
    解决动态规划的主要方法是,找出状态转移方程式:

    // s1, s2是输入字符串。arr[i][k]表示字符串s1[1...i]到字符串s2[1...k]的编辑距离。
    // 字符串的下标从1开始。1...i表示是双闭区间
    
    // 状态转移方程式如下:
    arr[i][k] = min(arr[i-1][k] + 1, arr[i][k-1] + 1, arr[i-1][k-1] + (s1[i] == s2[k] ? 1: 0));
    
    // 其中arr[0][k] 的长度是k, arr[i][0]的长度是i.
    // 那么s1到s2的距离即是:arr[lenOfs1][lenOfs2]
    
    
    int text_distance(const std::string &s1, const std::string &s2) {
        if (s1.empty() || s2.empty()) {
            return std::max<int>(s1.size(), s2.size());
        }
    
        const int N = s1.size();
        const int M = s2.size();
    
        int arr[N + 1][M + 1];
        memset(arr, 0, sizeof(arr));
    
        for (int i = 0; i <= N; i++) {
            arr[i][0] = i;
        }
        for (int j = 0; j <= M; j++) {
            arr[0][j] = j;
        }
    
    
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= M; j++) {
                char c1 = s1[i - 1];
                char c2 = s2[j - 1];
                // pay attention to operator precedence.
                // arr[i - 1][j - 1] + ((c1 != c2) ? 1 : 0) != arr[i - 1][j - 1] + (c1 != c2) ? 1 : 0
    
                arr[i][j] = min(min(arr[i - 1][j] + 1, arr[i][j - 1] + 1), arr[i - 1][j - 1] + ((c1 != c2) ? 1 : 0));
            }
        }
        return arr[N][M];
    }
    

    输入:

    zoologicoarchaeologist zoogeologist

    输出:

    10

    相关文章

      网友评论

          本文标题:编辑距离 Edit Distance

          本文链接:https://www.haomeiwen.com/subject/dzlafftx.html