注:下文的 regular bracket sequence 简写为 RBS
首先对于每个右括号,我们找到与其配对的左括号(也就是该右括号往左最短的 RBS)的位置(如果没有配对的就是 -1),比如样例对应的位置就是
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
括号 | ) | ( | ( | ( | ) | ) | ) | ) | ( | ( | ) | ( | ) | ) |
-1 | 3 | 2 | 1 | -1 | 9 | 11 | 8 |
数组可以很容易的用一个栈求得。
那么如何求最长的 RBS 呢?如果两个 RBS 相邻的话我们可以将他们合并为一个更长的 RBS,于是我们可以再遍历一遍数组并尝试扩展 RBS 的长度,我们便得到了以结尾的最长的 RBS,相应地更新答案即可。更新完之后的数组如下:(好吧其实没什么变化)
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
括号 | ) | ( | ( | ( | ) | ) | ) | ) | ( | ( | ) | ( | ) | ) |
-1 | 3 | 2 | 1 | -1 | 9 | 9 | 8 |
完整代码: