【问题标题】:Reconstruct the whitespace-omitted string in O(n^2)在 O(n^2) 中重构省略空格的字符串
【发布时间】: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


【解决方案1】:

您的想法很好(假设您知道找到最大不重叠区间集的问题的 O(n log n) 解决方案),并且您知道在 O(n^ 2)时间。但是,我认为问题比你做的要容易。

创建一个数组W[0...n]。如果无法将 i 以后的字符串切割成单词,W[i] 将为 0,否则它将存储开始有效切割字符串的单词的长度。

然后:

W[i] = min(j such that W[i:j] is a word, and i+j = n or W[i+j]>0)
       or 0 if there's no such j.

如果您保留字典,则可以在 O(n-i) 时间内计算 W[i],假设您已经计算了 W[i+1]W[n-1]。这意味着您可以在 O(n^2) 时间内计算出所有 W。或者如果你的字典中单词的最大长度是k,你可以在 O(nk) 时间内完成。

计算完所有W 后,当且仅当W[0] 不为0 时,整个字符串才能被分割成单词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2011-10-02
    • 2015-09-02
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多