【发布时间】:2017-08-27 05:44:50
【问题描述】:
This problem 简单地重申一下:给定一堆字符串和一个目标字符串,给定字符串的所有组合可以组合在一起形成目标字符串,有无重复。
例如
字符串:我们做我们必须做的,因为我们可以
目标:wedowhatwemustbecausewecan
输出:我们做我们必须做的,因为我们可以
我采取的方法是从目标中删除每个较长的单词,直到目标变为空。如果目标变为空,则只返回输出。如果较长的单词无法解决问题,那么尝试使用较短的单词等等。我还使用记忆化来确保如果目标已经尝试过然后返回,与记忆化回溯相同。
这个方法通过了除了 2 之外的所有测试用例,我正在超时。
def recursions(word_map, paswd, output, remember):
flag = 0
if len(paswd) == 0:
return 1
if paswd in remember:
return flag
for char in paswd:
for word in (word_map[char] if char in word_map else []):
if paswd.startswith(word):
output.append(word + " ")
if recursions(word_map, paswd[len(word):], output, remember):
return 1
output.pop()
remember[paswd] = 1
return flag
请帮忙提供一个提示。完整的解决方案是here。
【问题讨论】:
-
代码看起来是正确的,但如果递归太深可能会出现问题。但是在 stackoverflow 上调试问题需要一个特定的问题并在问题中重现问题。
-
尝试切换到pypy。虽然 pypy 的超时时间远低于 python,但在某些情况下您不会超过它。
标签: python algorithm recursion backtracking memoization