为什么要在解决方案中添加 +1

Why to added +1 in solution

正在浏览一些算法帖子。在审查时,我怀疑为什么我们在返回最终解决方案时在下面的代码中添加了 1。

import sys 

# Recursive function to find minimum  
# number of insertions 
def findMinInsertions(str, l, h): 

    # Base Cases 
    if (l > h): 
        return sys.maxsize 
    if (l == h): 
        return 0
    if (l == h - 1): 
        return 0 if(str[l] == str[h]) else 1

    # Check if the first and last characters are 
    # same. On the basis of the comparison result,  
    # decide which subrpoblem(s) to call 

    if(str[l] == str[h]): 
        return findMinInsertions(str, l + 1, h - 1) 
    else: 

        **return (min(findMinInsertions(str, l, h - 1), 
                findMinInsertions(str, l + 1, h)) + 1)** 

# Driver Code 
if __name__ == "__main__": 

    str = "abc"
    print(findMinInsertions(str, 0, len(str) - 1)) 

+1 用来计数。我们需要添加 while returning 回到父节点(从 0 { return 0 }+ 1 开始)。 然后取两个递归调用的最小值。

findMinInsertions(str, l, h - 1)

是插入最后一个字符后的最小插入次数。

findMinInsertions(str, l + 1, h)

是插入第一个字符后的最小插入次数。

min(findMinInsertions(str, l, h - 1), findMinInsertions(str, l + 1, h)) # (a)

是第一个字符或最后一个字符插入后的最小插入次数。要获得最少的插入次数,您可以在插入一个字符后取最少的插入次数 (a) 并添加一次插入(因为已经插入了一个字符)。

该算法在插入排序时没有找到最小插入次数,只是给出了插入次数的上限。通过简单地 运行 字符串 "abc" 上的算法来检查这一点很容易,结果是 2,而真正的最小插入是 0.

让我们看一下递归步骤:

if(str[l] == str[h]): 
    return findMinInsertions(str, l + 1, h - 1) 
else: 

    return (min(findMinInsertions(str, l, h - 1), 
            findMinInsertions(str, l + 1, h)) + 1)

如果str[l] == str[h],最小插入量由它们之间字符的值给出,因为str[l]和str[h]可以保持在它们的相对位置(意思是str[h] 将留在 str[l] 的右侧,因此我们将仅移动/插入索引 l 和 h 之间的字符。

一旦你意识到在相等的情况下会发生什么,你就会明白在不等式的情况下有一个 机会 移动字符 str[l] 或 str [h].

注意因为这只是一次移动角色的机会,所以算法产生插入次数的上限而不是最小值。