【问题标题】:canConstruct a memorization dynamic programming problem可以构造一个记忆动态规划问题
【发布时间】:2021-01-25 07:45:23
【问题描述】:

我说的是要解决一些动态规划问题,我遇到了一个问题是要解决一个字符串是否可以从一个字符串列表中构造出来。 我在 python 3.8 中使用了以下方法。

def canConstruct(target,workbank,memo={}):
if (target in memo):
    return(memo[target])
if len(target)==0:
    return(True)
for i in range (len(workbank)):
    pos=target.find(workbank[i])
    if (pos != -1):
        suffix=target[pos:pos+len(workbank[i])]
        out=canConstruct(suffix,workbank,memo)
        if (out==True):
            memo[target]=True
            return(True)
memo[target]=False
return(False)

print(canConstruct('aabbc',['aa','b','c']))

相比之下,我得到的错误最大递归深度超过了。 我检查了我的递归限制是 1000。 谁能告诉我我做错了什么。 提前谢谢你。

【问题讨论】:

  • 所以预期的输出是真的对吗?不是 String 对象吗?
  • 我知道错误在哪里,我想知道输出是什么,我正在更改函数
  • 是的,输出应该是 True。不是字符串对象

标签: python-3.x dynamic-programming


【解决方案1】:

好的,您的代码中几乎没有陷阱。

  1. 主要问题是 for 循环,因为每次调用该函数时,它都会启动一个新循环,因此 i 的索引始终为 1,这会产生最大递归深度错误。

  2. memo 参数是多余的,以使其成为字典,在这种情况下作为列表更好。

  3. 这个suffix=target[pos:pos+len(workbank[i])]位置不对,应该是:

    suffix = target[len(workbank[idx]):]]
    

因为你需要离开是已经调用并继续前进吧?

你正在做 [0:2] ,这又是 'aa'。 Insted 你应该做[2:] 这是bbc

解决方案

注意:我根据我理解的问题创建,如果您期望不同的输出,请在下面的评论中告诉我。

def canConstruct(target,workbank,memo=[], idx=0):

    pos = target.find(workbank[idx])
    if pos != -1:
        memo.append(True)
        idx += 1
        try:
            suffix = target[len(workbank[idx]):]
            canConstruct(suffix,workbank,memo, idx)
        except IndexError: # Here we exit the recursive call
            pass
    else: # In case it did not find string, append False 
        memo.append(False)
        
    return all(memo) # in order to be True, all item in memo must be True

print(canConstruct('aabbc',['aa','bb','c']))

输出

# True

【讨论】:

  • 当输入类似于 canConstruct('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef',['e','ee','eee','eeee','eeeee','eeeeee']) 时,您的代码会中断。但是谢谢你的第三点,我弄清楚了我的错误,问题就解决了。我使用“替换”作为建议的第三点。
  • @AritrikGhosh 是的,正如我在 注意: 中的回答中所说的那样,在给定不同输入的情况下,我并不真正理解该函数应该如何运行,将此答案标记为已接受,以便可以将其从未回答的队列中移出,谢谢
【解决方案2】:
def canConstruct(target, wordbank, memo=None):
if memo is None:memo={}
if target in memo:return memo[target]
if target == '':return True

for word in wordbank:
    if target.startswith(word):
        suffix = target.replace(word, '', 1)
        
        if canConstruct(suffix, wordbank, memo) == True:
            memo[target] = True
            return True

memo[target] = False
return False

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 2019-07-26
  • 2011-10-17
相关资源
最近更新 更多