【问题标题】:Not sure what this pseudo-code is saying不知道这个伪代码在说什么
【发布时间】:2015-04-30 14:46:23
【问题描述】:

我在Split a string to a string of valid words using Dynamic Programming 发现的另一个 stackoverflow 问题上看到了这个伪代码。

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

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

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

【问题讨论】:

    标签: dynamic dynamic-programming pseudocode


    【解决方案1】:

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

    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,那么输入字符串可以被拆分成字典中的单词。 for word starting at position i 只是检查字典中的所有单词,看看它们是否从那个位置开始。

    如果想要能够重构解决方案,他们可以将b 更改为一个int 数组,初始化为0,然后将if 更改为:

    if b[i + len(word)] != 0
        b[i] = i + len(word) //len(word) works too
        break
    

    【讨论】:

    • 谢谢。我相信这也是一个错误,您的修订使代码更有意义。但是将 b 设为 int 数组而不是 boolean 数组有什么意义呢?
    • 假设我们将b[i] 设置为i + len(word)。然后,如果有解决方案,b[i] != 0。然后我们可以通过从i = 0i = b[0] 的单词找到实际的解决方案,然后在b[b[0]] 重复直到我们到达字符串的末尾。
    • 对不起,“实际解决方案”是什么意思?我不明白如何将方法与布尔数组一起使用。
    • 布尔数组可以工作,但是说字符串是“writtendoganimals”。 b[0] 可以是 7,b[7] 可以是 10,b[10] 可以是 len(doc)。这样就可以知道“实际解决方案”是“书面”+“狗”+“动物”。
    • 哦,好的,int 数组将提供一种“检索”实际字符串的方法。更进一步,我明白了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2010-10-04
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多