繁体   English   中英

需要减少这个function中的递归调用次数

[英]Need to reduce the number of recursive calls in this function

问题是给定一个字符串 S 和一个 integer k<len(S) 我们需要找到字典顺序中最高的字符串,删除任何 k 个字符但保持字符串的相对顺序。

这是我到目前为止所拥有的:

def allPossibleCombinations(k,s,strings):
    if k == 0:
       
        strings.append(s)
        return strings
    
    for i in range(len(s)):
        new_str = s[:i]+s[i+1:]
        strings = allPossibleCombinations(k-1, new_str, strings)
        
    return strings

def stringReduction(k, s):
    strings = []
    combs = allPossibleCombinations(k,s, strings)
    return sorted(combs)[-1]

这适用于一些测试用例,但它说我对其他测试用例有太多递归调用。 我不知道测试用例。

这应该让你开始 -

from itertools import combinations

def all_possible_combinations(k = 0, s = ""):
  yield from combinations(s, len(s) - k)

现在对于给定的k=2s="abcde" ,我们显示s所有组合并删除了k个字符 -

for c in all_possible_combinations(2, "abcde"):
  print("".join(c))

# abc
# abd
# abe
# acd
# ace
# ade
# bcd
# bce
# bde
# cde

它说我对其他测试用例有太多递归调用

我很惊讶它在递归调用中失败了,然后才花了太长时间才给出答案。 递归深度与k相同,因此k必须达到 1000 才能使默认 Python 窒息。 但是,您的代码需要 4 分钟才能解决看似简单的示例:

print(stringReduction(8, "dermosynovitis"))

时间量是k和字符串长度的function。 递归地,我看到的问题是这段代码:

for i in range(len(s)):
    new_str = s[:i]+s[i+1:]
    strings = allPossibleCombinations(k-1, new_str, strings, depth + 1)

一旦我们删除了第一个字符,并在没有它的情况下完成了所有组合,就没有什么可以阻止递归调用从再次删除第一个字符并尝试所有组合中删除第二个字符。 我们正在(重新)测试太多的字符串!

基本问题是您需要在测试时修剪(即避免)字符串,而不是生成所有可能性并测试它们。 如果候选人的第一个字母小于您迄今为止看到的最佳字符串的首字母,则对该候选人中剩余字符的任何操作都不会改善它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM