#qJDPybttg050104. 1572:括号配对

1572:括号配对

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

Hecy 又接了个新任务:BE 处理。BE 中有一类被称为 GBE。

以下是 GBE 的定义:

  1. 空表达式是 GBE;
  2. 如果表达式 AA 是 GBE,则 [A][A](A)(A) 都是 GBE;
  3. 如果 AABB 都是 GBE,那么 ABAB 是 GBE。

给定一个由 ()[] 四种字符组成的字符串(可能不是 GBE),你可以在任意位置添加括号(()[]),使之成为 GBE。求最少需要添加的字符数。


输入格式

输入仅一行,为一个字符串 BEBE,只包含 ()[] 四种字符。


输出格式

输出仅一个整数,表示使该字符串成为 GBE 所需添加的最少字符数。


样例

样例输入

[])

样例输出

1

样例解释

输入字符串:[] )(注意中间无空格,这里分开是为了清晰)。

一个 GBE 要求括号匹配且嵌套正确。
当前字符串 []) 中:

  • [] 是合法的 GBE;
  • 但右括号 ) 没有匹配的左括号 (

我们可以添加一个左括号 ( 在开头,变成 ([]),这是 GBE:

  • () 是 GBE(由规则 2 从空得到),[] 是 GBE,([]) 是 GBE(规则 2,A=[])。

所以只需要添加 11 个字符。


数据范围

对于 100%100\% 的数据,输入的字符串长度 len<100len < 100


时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
此题为 括号匹配的区间 DP 问题。

dp[i][j]dp[i][j] 表示将子串 s[ij]s[i \dots j] 变成合法 GBE 所需添加的最少字符数。

状态转移:

  1. 如果 s[i]s[i]s[j]s[j] 匹配(即 () 匹配 或 [] 匹配),则 dp[i][j]=dp[i+1][j1]dp[i][j] = dp[i+1][j-1]
  2. 否则 dp[i][j]=min(dp[i+1][j],dp[i][j1])+1dp[i][j] = \min(dp[i+1][j], dp[i][j-1]) + 1(添加一个括号与 s[i]s[i]s[j]s[j] 匹配);
  3. 也可以枚举中间分割点 kk,将字符串分成两部分分别处理:$dp[i][j] = \min_{i \le k < j} \{ dp[i][k] + dp[k+1][j] \}$。

初始化:dp[i][i]=1dp[i][i] = 1(单个字符需要添加一个匹配字符)。

最终答案:dp[0][n1]dp[0][n-1],其中 nn 是字符串长度。

时间复杂度 O(n3)O(n^3)n<100n<100 可以接受。