Dynamic 不确定这个伪代码在说什么

Dynamic 不确定这个伪代码在说什么,dynamic,dynamic-programming,pseudocode,Dynamic,Dynamic Programming,Pseudocode,我在这里找到的另一个stackoverflow问题上看到了这个伪代码 问题是一个动态规划问题,看看输入字符串是否可以从字典中拆分成单词 第三行,表示将大小为[N+1]的数组b设置为所有假值?我很肯定这一点。但我真的不确定的是第五行。那是for循环还是什么?我觉得说“for I in range”的伪代码只有2个值。那句话是什么意思 def try_to_split(doc): N = len(doc) b = [False] * (N + 1) b[N] = True f

我在这里找到的另一个stackoverflow问题上看到了这个伪代码

问题是一个动态规划问题,看看输入字符串是否可以从字典中拆分成单词

第三行,表示将大小为[N+1]的数组b设置为所有假值?我很肯定这一点。但我真的不确定的是第五行。那是for循环还是什么?我觉得说“for I in range”的伪代码只有2个值。那句话是什么意思

def try_to_split(doc):
   N = len(doc)
   b = [False] * (N + 1)
   b[N] = True
   for i in range(N - 1, -1, -1):
      for word starting at position i:
         if b[i + len(word)]:
            b[i] = True
            break
   return b

这是一个令人困惑的语法,我很确定这是一个错误。应该是:

for i in range(N - 1, 0, -1) //0, not -1
我相信这意味着

for i from (N - 1) downto 0 //-1 was the step, like i-- or i -= 1
这对于算法来说是有意义的,因为它只是从字符串的末尾开始,并求解每个尾随子字符串,直到到达开头。如果b[0]在结尾处为true,则可以从字典中将输入字符串拆分为单词。对于从位置开始的单词,我只是检查字典中的所有单词,看看它们是否从该位置开始

如果希望能够重建解决方案,可以将b更改为int数组,初始化为0s,然后将If更改为:


非常感谢。我认为这也是一个错误,您的修订使代码更有意义。但是将b设为int数组而不是布尔数组有什么意义呢?假设我们将b[i]设为i+lenword。那么,如果有解决方案,b[i]!=0然后我们可以通过从i=0到i=b[0]来找到实际的解决方案,然后在b[b[0]]重复,直到我们到达字符串的末尾。对不起,你所说的实际解决方案是什么意思?我看不出使用布尔数组的方法是如何不起作用的。布尔数组可以起作用,但可以说字符串是writendorganimals。b[0]可以是7,b[7]可以是10,b[10]可以是lendoc。通过这种方式,您可以知道实际的解决方案是编写+狗+动物。我明白了,再往前走一步。非常感谢。
if b[i + len(word)] != 0
    b[i] = i + len(word) //len(word) works too
    break