我正在研究一些算法。在审查时,我有一个疑问,为什么我们在返回最终解决方案的同时在下面的代码中添加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))
答案 0 :(得分:0)
+1用于计数。我们需要在返回父节点时添加(从0 {return 0} +1开始)。 然后至少进行两次递归调用。
答案 1 :(得分:0)
findMinInsertions(str, l, h - 1)
是插入最后一个字符后的最小插入次数。
findMinInsertions(str, l + 1, h)
是插入第一个字符后的最小插入次数。
min(findMinInsertions(str, l, h - 1), findMinInsertions(str, l + 1, h)) # (a)
是插入第一个字符或最后一个字符后的最小插入次数。要获得最少的插入次数,您可以在插入一个字符后采用最小插入次数(a)并添加一个插入(因为已经插入了一个字符)。
答案 2 :(得分:0)
该算法无法在插入排序期间找到最小插入次数,而仅给出插入次数的上限。只需在字符串“ 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]的机会。< / p>
注意,由于这只是移动字符的机会,因此该算法会产生插入次数的上限,而不是最小值。