您可以递归地执行此操作,但是您需要在函数之间传递和返回大量状态信息,当这个问题可以通过一个简单的循环来解决时,我认为这是不值得的。
正如其他人所说,有两种可能的“期望结果”字符串:一种以大写字母开头(我们称之为 result_U),另一种以小写字母开头(result_L)。我们想要 EditDistance(input, result_U) 和 EditDistance(input, result_L) 中较小的一个。
还要注意,要计算 EditDistance(input, result_U),我们不需要生成 result_U,我们只需要一次扫描输入 1 个字符,每个不是预期大小写的字符都需要 1 次编辑才能使其成为正确的情况,即在编辑距离上加 1。EditDistance(输入,result_L)同上。
此外,我们可以组合这两个循环,以便我们只扫描一次输入。事实上,这可以在读取每个输入字符串时完成。一种天真的方法如下所示:
伪代码:
EditDistance_U = 0
EditDistance_L = 0
Read a character
To arrive at result_U, does this character need editing?
Yes => EditDistance_U += 1
No => Do nothing
To arrive at result_L, does this character need editing?
Yes => EditDistance_L += 1
No => Do nothing
Loop until end of string
EditDistance = min(EditDistance_U, EditDistance_L)
也可以对上述内容进行明显的优化,但我会把它留给你。
提示 1:循环中真的需要 2 个条件吗?它们是如何相互关联的?
提示 2:什么是 EditDistance_U + EditDistance_L?