【问题标题】:Why to added +1 in solution为什么要在解决方案中添加 +1
【发布时间】:2019-03-21 07:04:34
【问题描述】:

我正在浏览一些算法帖子。在审查时,我怀疑为什么我们在返回最终解决方案时在下面的代码中添加了 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)) 

【问题讨论】:

  • lh 参数似乎是字符串 str 的索引。您需要添加 1 才能到达 下一个 字符。
  • 我已经编辑了帖子,请再次查看@Someprogrammerdude。为什么我们在return语句的末尾加了1 return (min(findMinInsertions(str, l, h - 1),findMinInsertions(str, l + 1, h)) + 1)
  • 这个程序在做什么,在我看来像加了 1,因为当前执行的递归应该算作 1。就像如果 str[l] != str[h],一个操作需要在将当前问题简化为子问题之前,将其计为 1。
  • 此算法用于查找字符串中的最小插入次数以使其成为回文。

标签: python algorithm dynamic-programming insertion-sort


【解决方案1】:
findMinInsertions(str, l, h - 1)

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

findMinInsertions(str, l + 1, h)

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

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

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

【讨论】:

    【解决方案2】:

    +1 用于计数。我们需要在返回父节点时添加(从 0 { return 0 }+ 1 开始)。 然后进行两次递归调用。

    【讨论】:

    • 在从递归返回最小值时,它计算我们拥有的最小元组数。那为什么需要在答案中加1。
    【解决方案3】:

    该算法在插入排序期间没有找到最小插入次数,而只是给出了插入次数的上限。只需在字符串“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] 中的一个。

    请注意,由于它只是移动字符的机会,因此该算法会产生插入次数的上限,而不是最小值。

    【讨论】:

    • 此算法不适用于插入排序。实际上这个算法计算了我们需要多少最小插入来生成字符串回文。
    • @ParulGarg 你应该在你的问题中提到算法的目的。
    猜你喜欢
    • 2013-09-24
    • 2013-09-05
    • 1970-01-01
    • 2021-05-20
    • 2018-04-02
    • 2013-08-24
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多