【发布时间】:2017-02-22 21:38:55
【问题描述】:
我想检查我的算法是否正确。
给定一个包含 n 个字符且所有空格都省略的字符串,
Ex: "itwasthebestoftimes"
给出一个动态规划算法,该算法确定字符串是否可以分解为有效的单词序列,并在 O(n2) 内用空格重构一个有效的字符串。
我的想法:
首先找到一个字符串的所有子字符串(O(n2)),并为每个子字符串映射它在空间中的位置和长度作为一个区间。
Ex: "it was the best"
[] [-] [-] [--]
[---] []
[]
(添加了空间以使其更易于查看)。
在上面的例子中,“it”是有效的,得到一个区间值2,“was”得到3,等等。字符串“twas”也是有效的,得到一个值4。
然后将其简化为最小最大问题,以找到间隔集中的最大非重叠长度。由于有效字符串必须包含所有字母,因此最大长度的非重叠间隔将是答案,找到它需要 Theta(n*log(n))。
因此解决方案将采用 O(n2 + n*log(n)) = O(n2)
我的想法对吗?
【问题讨论】:
-
你如何选择哪个子字符串去哪一行?当您尝试将新的子字符串放入较低的行时,因为它重叠,您怎么知道 - 也许通过重新排列行中的现有子字符串,您可以在某处放置新的子字符串?
-
抱歉,已编辑。子字符串进入哪个“行”并不重要,对于极小极大求解器来说是任意的。重要的是检查是否存在由区间坐标给出的碰撞。这些行只是为了简化视觉表示
-
实际上,您是否有任何指向 O(n log n) 算法的指针,用于查找最大总长度间隔的不相交子集?在 O(n^2) 中很容易做到(使用相同的动态编程),但我没有立即看到(并且在简短搜索后找不到任何材料)如何在 O(n log n) 中做到这一点。您确定您没有将这个问题与找到最大 number 个不相交间隔而不是最大 total length 混为一谈吗?对于最大数量的贪心算法,确实是 O(n log n)。
-
@avysk,这是图形形式的等效问题。 wincent.com/wiki/…
-
这根本不是等价的,它是关于线性路径的。对于重叠区间,结构更复杂,同样的动态规划方法会给出 O(n^2)。
标签: algorithm dynamic-programming