我对 leetcode 72 上的递归方法感到茫然
I'm at loss with a recursive method on leetcode 72
虽然这将是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将是解决方案。
关于算法的动态规划版本,一旦定义了递归和必要的基本情况,就很容易推导它。
- C++:正在检查LinkedList中的回文-递归方法-错误
- 数组元素打印的递归方法
- 我对 leetcode 72 上的递归方法感到茫然
- 使用递归方法遇到分段错误
- 我的链接列表反向递归方法的代码的问题是什么?
- 在链接列表中找到值的递归方法
- 我应该如何实现递归方法以找到在C++中形成最大堆的多种方法
- 使用递归方法将矢量作为输入时进行分割故障
- 使用递归方法的类,使用int矢量元素作为输入
- 3D 迷宫递归方法 - C++
- 这种遍历二叉树的递归方法在一些递归后崩溃!为什么?
- 迭代器回到递归方法的开头
- 如何创建一个递归方法来比较两个值
- 为什么将十进制转换为二进制的递归方法比迭代、使用和返回字符串更快
- 递归方法中的 C++ 凸包
- 如何将查找组合的几个循环代码转换为递归方法
- 删除单向链表最后一个元素的递归方法
- 反转字符串的递归方法
- 使用递归方法反转ifstream输入
- 如何替换字符串中的某个字符?最好是递归方法