【Leetcode题解】Leetcode 72 : 编辑距离 [困难]


LeetCode 目录
LeetCode 4:寻找两个有序数组的中位数 [困难][二分]
Leetcode 8:字符串转换整数 (atoi) [中等]
LeetCode 54:螺旋矩阵Ⅰ
LeetCode 59:螺旋矩阵 Ⅱ
LeetCode 111: 二叉树的最小深度[递归/非递归求解/队列]
LeetCode 149:一条直线上最多的点数
LeetCode 365:水壶问题 [中等] [DFS][数学]
LeetCode 350: 两个数组的交集 II [简单]
LeetCode 150:计算逆波兰式(后缀表达式)的值
LeetCode 876:链表的中间节点 [简单]
LeetCode 945: 使数组唯一的最小增量 [中等]


  • Leetcode 72 : 编辑距离 [困难]
    • 题目描述
    • 思路
      • 参考代码


Leetcode 72 : 编辑距离 [困难]

题目描述

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

  1. 插入一个字符
  2. 删除一个字符
  3. 替换一个字符

Tips:是用来度量两个序列相似程度的指标。通俗地来讲,编辑距离指的是在两个单词之间,由其中一个单词s1转换为另一个单词s2所需要的最少单字符编辑操作次数。操作的种类有插入、删除以及替换。

思路

第一感觉就是算法课上的动态规化算法,动态规划算法重要的时找到状态转移矩阵

有以下结论:

  • 对单词 word1 删除一个字符和对单词 word2 插入一个字符是等价的

  • 对单词 word1 替换一个字符和对单词 word2 替换一个字符是等价的

  • 本质上不同的操作只有3种

    • 在单词 word1 中插入一个字符
    • 在单词 word2 中插入一个字符
    • 修改单词 word1 的一个字符

状态转移方程:

  1. 若word1 和word2 的最后一个字母相同
D[i][j] = min(D[i][j−1]+1,D[i−1][j]+1,D[i−1][j−1])
        = 1 + min(D[i][j−1],D[i−1][j],D[i−1][j−1]−1)
  1. 若word1 和word2 的最后一个字母不同
D[i][j] = 1 + min(D[i][j−1],D[i−1][j],D[i−1][j−1])

参考代码

class Solution {
public:
    int minDistance(string word1, string word2) {
        int n = word1.length();
        int m = word2.length();

        //有一个字符串为空串
        if(n*m==0){
            return n+m;
        }

        //动态规化数组
        int dp[n+1][m+1];

        //边界状态初始化
        for(int i=0;i<n+1;i++){
            dp[i][0] = i;
        }
        for(int j=0;j<m+1;j++){
            dp[0][j] = j;
        }

        //动态规化计算所有的dp值
        for(int i=1;i<n+1;i++){
            for(int j=1;j<m+1;j++){
                int left = dp[i-1][j] + 1;
                int down = dp[i][j-1] + 1;
                int left_down = dp[i-1][j-1];
                if(word1[i-1] != word2[j-1]) left_down += 1;
                dp[i][j] = min(left,min(down,left_down));
            }
        }

        return dp[n][m];
    }
};

你可能感兴趣的:(LeetCode,题解)