我对 leetcode 72 上的递归方法感到茫然

I'm at loss with a recursive method on leetcode 72

本文关键字:茫然 递归方法 leetcode 我对      更新时间:2023-10-16

虽然这将是TLE,但我认为理解使用动态编程的有效解决方案对我来说很有用,这是描述和代码:

给定两个单词 word1 和 word2,找到将 word1 转换为 word2 所需的最小步骤数。(每个操作计为 1 个步骤。 您允许对一个单词执行以下 3 种操作: a( 插入字符 b( 删除字符 c( 替换字符

int minDistance(string word1, string word2) {
if(word1 == word2) return 0;
int m = word1.size();
int n = word2.size();
if(word1 == "")
{
return n;
}
if(word2 == "")
{
return m;
}
if(word1[0] == word2[0])
{
return minDistance(word1.substr(1), word2.substr(1));
}
else
{
return min(1 + minDistance(word1, word2.substr(1)), min(1 + minDistance(word1.substr(1), word2), 1 + minDistance(word1.substr(1), word2.substr(1))));
}
}

一个问题是我无法确定 ELSE 结构的含义——在我看来,它有三种不同的情况,所以我想它分别实现了插入删除替换(可能是顺序不正确( 另一个是如何理解当一个字符串为空时,结果将是另一个字符串的长度?

return 
min
(
1 + minDistance(word1, word2.substr(1)), <-insert from word2
1 + minDistance(word1.substr(1), word2), <-delete from word1
1 + minDistance(word1.substr(1), word2.substr(1)) <-replace
)  

首先,
"插入"情况意味着我们从 word2 中获取第一个字符并将其插入到 word1 中(并增加"编辑距离"成本(,这给我们留下了 word1 和 word2.substr(1(

">

删除"情况意味着我们丢弃 word1 的第一个字符(并增加"编辑距离"成本(,这给我们留下了 word1.substr(1( 和 word2

">

替换"情况意味着两个单词的第一个字符是不同的,因此我们增加"编辑距离"成本并丢弃第一个字符,从而留下word1.substr(1(和word2.substr(1(

">

相同"的情况意味着两个单词的第一个字符是相同的,所以我们不需要增加"编辑距离"成本,因此我们只是扔掉第一个字符,留下word1.substr(1(和word2.substr(1(

因此,我们有 3 种不同的可能性需要检查,这就是为什么我们为所有 3 种情况递归调用函数,并通过选取最小的可能性来比较它们的最终成本。

其次,基本情况"return n"意味着为了将空字符串转换为word2,我们肯定需要将单词2中的n个字符插入word1,这将"n"添加到"编辑距离"成本中。 同样,基本情况"return m"意味着为了将word1转换为空字符串,我们肯定需要从word1中删除m个字符,这会将"m"添加到"编辑距离"成本
中。

您的算法是更通用的"编辑距离"算法的特例,可以通过修改插入/删除/替换/相同的成本来应用于广泛的问题。对于您的特定情况,目标是找到将word1转换为word2所需的最小步骤数,因此"插入/删除/替换"的成本= 1和"相同"的成本= 0将是解决方案。

关于算法的动态规划版本,一旦定义了递归和必要的基本情况,就很容易推导它。