分组符号最大长度平衡子序列

Posted

技术标签:

【中文标题】分组符号最大长度平衡子序列【英文标题】:Grouping Symbols Maximum Length Balanced Subsequence 【发布时间】:2015-02-19 10:27:20 【问题描述】:

将 B 视为一组符号 (, )、[、]、 和 的序列。如果 B 的长度为 0 或 B 具有以下形式之一,则称为平衡序列: X Y 或 [ X ] Y 或 X Y 其中 X 和 Y 本身是平衡的。平衡示例: ( ) - [ ] ( ) [ ] - ...

现在的问题是找到一种有效的算法来找到给定输入的最大长度平衡子序列(不一定是连续的),它是这些分组符号的字符串。

例如,如果输入是 ( ) ( [ ) ] ( ] ) [ ] ,则最大长度子序列之一是 ( ) [ ] ( ) [ ]

我几乎可以肯定解决方案是 DP,但无论如何我解决了它,我发现我的算法不起作用的例子。我确定只有一种方法,即 DP 和分而治之的结合。但它效率不高,因为无论如何 D&C 部分会一遍又一遍地解决一些重叠的问题。

【问题讨论】:

【参考方案1】:

让我们做几个简单的观察:

    任何平衡子序列都可以表示为A1 X A2 Y,其中A1A2是两个匹配的括号(()、[]或),XY是平衡子序列(它们可以是空的)。这是真的,因为在任何平衡的非空子序列中都有一个最左边的括号,并且它必须与某些东西匹配。

    XY 是独立的。如果不是,则子序列不平衡。

这些观察为我们提供了一个动态规划解决方案:

假设f(L, R)[L, R] 子数组的最长平衡子序列。 基数是一个空子数组。过渡如下:

f(L, R) = max(   
     f(L + 1, R) // ignore the first element    
     max(f(L + 1, K - 1) + 2 + f(K + 1, R)) for all K if brackets at positions L and K match
)

时间复杂度为O(N^3),因为有O(N^2) 子数组并且每个子数组都有O(N) 转换。可以使用标准答案重建技术来重建最长的子序列本身。

【讨论】:

所以我知道 k 的范围必须是 L+2 @Nima 我假设我们可以使用 L > R 的空范围(答案为零)。它使我们可以避免专门处理这种情况。 Knuth-Yao 四边形不等式加速适用于这个问题,对吧?所以你可以在 O(n^2) 内完成吗? @harold 不,它不适用于这个问题。例如,对于字符串 () 和 a = 0、b = 1、c = 2 和 d = 3,则不成立。

以上是关于分组符号最大长度平衡子序列的主要内容,如果未能解决你的问题,请参考以下文章

最大上升子序列,最大下降子序列,最大非增子序列

算法 LC 动态规划 - 最大递增子序列

最大子序列和 (单调队列优化DP)

最大子序列和(单调队列算法)

阿里笔试题:求两个子序列的最大连续子序列

阿里笔试题:求两个子序列的最大连续子序列