⭐算法入门⭐《动态规划 - 串匹配》困难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、原题链接
二、解题报告
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...bj−1 的最少操作数已经求出,等于 f ( i , j − 1 ) f(i,j-1) f(i,j−1),则需要在 a [ i ] a[i] a[i] 的后面插入一个字符 b j b_j bj,那么最少操作数为:
- f ( i , j − 1 ) + I f(i, j-1) + I f(i,j−1)+I
- 如图所示,源字符串为 “AGTA”,目标字符串为 “GATCGT” 的情况下,将源字符串变成 "“GATCG” 的最小消耗为 f ( i , j − 1 ) f(i,j-1) f(i,j−1),那么只要在源字符串最后再插入一个 ‘T’,就可以把源字符串变成目标字符串 “GATCGT”;
2)删除
- 假设 a 0 a 1 . . . a i − 1 a_0a_1...a_{i-1} a0a1...ai−1 变成 b 0 b 1 . . . b j b_0b_1...b_{j} b0b1...bj 的最少操作数已经求出,等于 f ( i − 1 , j ) f(i-1,j) f(i−1,j),则需要把 a i a_i ai 个删掉,那么产生的最少操作数为:
- f ( i − 1 , j ) + D f(i-1,j) + D f(i−1,j)+D
- 如图所示,源字符串为 “AGTA”,目标字符串为 “GATCGT” 的情况下,将 “AGT” 变成目标字符串的最小消耗为 f ( i − 1 , j ) f(i-1,j) f(i−1,j),那么只要把源字符串最后一个’A’删掉,就可以把源字符串变成目标字符串;
3)替换
- 假设 a 0 a 1 . . . a i − 1 a_0a_1...a_{i-1} a0a1...ai−1 变成 b 0 b 1 . . . b j − 1 b_0b_1...b_{j-1} b0b1...bj−1 的最少消耗已经求出,等于 f ( i − 1 , j − 1 ) f(i-1,j-1) f(i−1,j−1),则将 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(i−1,j−1)+{0Rai=bjai=bj
- 如图所示,源字符串为 “AGTA”,目标字符串为 “GATCGT” 的情况下,将 “AGT” 变成 “GATCGT” 的最小操作数为 f ( i − 1 , j − 1 ) f(i-1,j-1) f(i−1,j−1),那么只要将 源字符串 的最后一个字符 替换为 目标字符串 的最后一个字符 ,就可以把源字符串变成目标字符串;替换时根据 源字符串 和 目标字符串 原本是否相等来决定操作数;
4)边界处理
- 边界情况主要考虑以下几种:
a. 空串变成目标串
- 即
f
(
−
1
,
j
)
f(-1,j)
f(−1,j),总共需要插入 44. 通配符匹配-动态规划-困难
最大回文子串匹配:暴力算法中心拓展法动态规划manacher算法