递归实现count_construct函数无法重复使用词库元素的修复需求
递归实现count_construct函数无法重复使用词库元素的修复需求
你遇到的问题核心是当前递归逻辑限制了选词的范围——只能按词库顺序往后选,一旦跳过某个词,就再也没法回头用它了,这直接导致p+ur+p+le这种需要重复使用前面词库元素的组合被漏掉,所以才会少算一种情况。
问题出在哪?
你的helper函数用index参数控制遍历词库的进度:当你选择跳过当前词(count_without_current = helper(index + 1, current)),index会递增,后续递归就只能从更靠后的词开始选。比如当你处理到ur(index=2)之后,就再也没法选到前面的p(index=1),自然生成不了需要二次使用p的那条路径。
修复方案
我们需要改成每次递归都能遍历整个词库的逻辑,允许重复使用任意词库元素,不受顺序限制。修改后的代码如下:
def count_construct(target, word_bank): def helper(current): # 终止条件:拼出目标字符串,算一种有效组合 if current == target: return 1 # 终止条件:拼接长度超过目标,直接返回0 if len(current) > len(target): return 0 total_count = 0 # 遍历整个词库,每个词都尝试拼接 for word in word_bank: # 提前检查拼接后是否是目标的前缀,避免无效递归 if target.startswith(current + word): total_count += helper(current + word) return total_count return helper('')
测试验证
用你的示例测试:
target_example = "purple" word_bank_example = ["purp", "p", "ur", "le", "purpl"] print(count_construct(target_example, word_bank_example)) # 输出2,符合预期
这个逻辑的核心是,每次递归都不限制选词的范围,只要当前拼接后的字符串是目标的前缀,就可以继续用这个词(或其他任意词)往下拼,完美覆盖了所有可能的组合方式。
备注:内容来源于stack exchange,提问作者Ashura
相关产品推荐
相关产品推荐

