【问题标题】:Splitting a string into words with dynamic programming使用动态编程将字符串拆分为单词
【发布时间】:2017-03-17 18:48:11
【问题描述】:

在这个问题中,我们必须将字符串拆分为有意义的单词。我们得到了一本字典来查看这个词是否存在。

我在How to split a string into words. Ex: "stringintowords" -> "String Into Words"? 看到了其他一些方法。

我想到了一种不同的方法,想知道它是否可行。

例子-它看起来像句子

算法

字符串的每个字母对应一个 DAG 中的一个节点。

将 bool 数组初始化为 False。

在每个节点我们都有一个选择——如果将当前字母添加到前一个子数组仍然产生一个有效的单词,然后添加它,如果没有,那么我们将从该字母开始一个新单词并设置 bool[previous_node ]=True 表示一个单词在那里结束。在上面的示例中,bool[1] 将被设置为 true。

这类似于最大子数组和问题。

这个算法行得通吗?

【问题讨论】:

  • 子串还是子序列?

标签: string algorithm split dynamic-programming


【解决方案1】:

不,不会。您的解决方案在每一步都使用尽可能长的单词,但这并不总是有效。

这里是反例:

假设给定的字符串是aturtle。您的算法将采用a。然后它将t 视为at 是有效单词。 atu 不是一个词,所以它会拆分输入:at + urtle。但是,没有办法将urtle 拆分为一系列有效的英文单词。正确答案是a + turtle

其中一种可能的正确解决方案使用动态规划。我们可以定义一个函数f 使得f(i) = true IFF 可以将输入的第一个i 字符拆分为有效的单词序列。最初,f(0) = true 和其余值是 false。如果s[l + 1, r] 是所有有效lr 的有效词,则存在从f(l)f(r) 的转换。

附:其他类型的贪心算法在这里也不起作用。例如,如果你取最短的单词而不是最长的单词,它就无法处理,例如输入atnight:在a被剥离后,无法拆分tnight,但是@ 987654344@ + night 显然是一个有效的答案。

【讨论】:

    猜你喜欢
    • 2011-07-15
    • 2011-05-20
    • 1970-01-01
    • 2011-06-12
    • 2014-06-09
    • 1970-01-01
    • 2021-11-14
    • 2022-01-18
    • 2011-10-23
    相关资源
    最近更新 更多