⭐算法入门⭐《动态规划 - 串匹配》困难02 —— LeetCode 72. 编辑距离

Posted 英雄哪里出来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《动态规划 - 串匹配》困难02 —— LeetCode 72. 编辑距离相关的知识,希望对你有一定的参考价值。

🙉饭不食,水不饮,题必须刷🙉

C语言免费动漫教程,和我一起打卡!
🌞《光天化日学C语言》🌞

LeetCode 太难?先看简单题!
🧡《C语言入门100例》🧡

数据结构难?不存在的!
🌳《数据结构入门》🌳

LeetCode 太简单?算法学起来!
🌌《夜深人静写算法》🌌

究极算法奥义!深度学习!
🟣《深度学习100例》🟣

一、题目

1、题目描述

给定两个长度不超过 500 的单词 A A A B B B,请计算出将 A A A 转换成 B B B 所使用的最少操作数 。可以对一个单词进行如下三种操作:
  1)插入一个字符;
  2)删除一个字符;
  3)替换一个字符;

  样例输入: A = "intentiona"B = "executiona"
  样例输出: 5

2、基础框架

  • c++ 版本给出的基础框架代码如下:
class Solution {
public:
    int minDistance(string word1, string word2) {
    }
};
  • word1就是源串 A;
  • word2就是目标串 B;

3、原题链接

LeetCode 72. 编辑距离

二、解题报告

1、思路分析

  • f ( i , j ) f(i, j) f(i,j) 表示 源串前缀 a 0 a 1 . . . a i a_0a_1...a_{i} a0a1...ai 变成 目标串前缀 b 0 b 1 . . . b j b_0b_1...b_{j} b0b1...bj 的最小操作数。
  • I I I D D D R R R 分别为插入一个字符、删除一个字符、替换一个字符的操作数,本题中值均为 1。

1)插入

  • 假设 a 0 a 1 . . . a i a_0a_1...a_{i} a0a1...ai 变成 b 0 b 1 . . . b j − 1 b_0b_1...b_{j-1} b0b1...bj1 的最少操作数已经求出,等于 f ( i , j − 1 ) f(i,j-1) f(i,j1),则需要在 a [ i ] a[i] a[i] 的后面插入一个字符 b j b_j bj,那么最少操作数为:
  • f ( i , j − 1 ) + I f(i, j-1) + I f(i,j1)+I
  • 如图所示,源字符串为 “AGTA”,目标字符串为 “GATCGT” 的情况下,将源字符串变成 "“GATCG” 的最小消耗为 f ( i , j − 1 ) f(i,j-1) f(i,j1),那么只要在源字符串最后再插入一个 ‘T’,就可以把源字符串变成目标字符串 “GATCGT”;

2)删除

  • 假设 a 0 a 1 . . . a i − 1 a_0a_1...a_{i-1} a0a1...ai1 变成 b 0 b 1 . . . b j b_0b_1...b_{j} b0b1...bj 的最少操作数已经求出,等于 f ( i − 1 , j ) f(i-1,j) f(i1,j),则需要把 a i a_i ai 个删掉,那么产生的最少操作数为:
  • f ( i − 1 , j ) + D f(i-1,j) + D f(i1,j)+D
  • 如图所示,源字符串为 “AGTA”,目标字符串为 “GATCGT” 的情况下,将 “AGT” 变成目标字符串的最小消耗为 f ( i − 1 , j ) f(i-1,j) f(i1,j),那么只要把源字符串最后一个’A’删掉,就可以把源字符串变成目标字符串;

3)替换

  • 假设 a 0 a 1 . . . a i − 1 a_0a_1...a_{i-1} a0a1...ai1 变成 b 0 b 1 . . . b j − 1 b_0b_1...b_{j-1} b0b1...bj1 的最少消耗已经求出,等于 f ( i − 1 , j − 1 ) f(i-1,j-1) f(i1,j1),则将 a i a_i ai 替换成 b j b_j bj a 0 , a 1 , . . . , a i a_0,a_1,...,a_{i} a0,a1,...,ai 就可以变成 b 0 , b 1 , . . . b j b_0,b_1,...b_{j} b0,b1,...bj。替换时需要考虑 a i = b j a_i=b_j ai=bj a i ≠ b j a_i \\neq b_j ai=bj 的情况,所以替换产生的最小操作数为:
  • f ( i − 1 , j − 1 ) + { 0 a i = b j R a i ≠ b j f(i-1,j-1) + \\begin{cases} 0 & a_i=b_j \\\\ R & a_i \\neq b_j\\end{cases} f(i1,j1)+{0Rai=bjai=bj
  • 如图所示,源字符串为 “AGTA”,目标字符串为 “GATCGT” 的情况下,将 “AGT” 变成 “GATCGT” 的最小操作数为 f ( i − 1 , j − 1 ) f(i-1,j-1) f(i1,j1),那么只要将 源字符串 的最后一个字符 替换为 目标字符串 的最后一个字符 ,就可以把源字符串变成目标字符串;替换时根据 源字符串 和 目标字符串 原本是否相等来决定操作数;

4)边界处理

  • 边界情况主要考虑以下几种:

a. 空串变成目标串