这题难道不应该添加spj吗

P1241 括号序列

vectorwyx @ 2021-01-18 21:04:49

RT,或许是我太菜了,为啥我觉得对于输入((输出()()(())按照题意都是对的呢?


by data_structure @ 2021-01-18 21:07:03

你要做的,是补全该括号序列,即扫描一遍原序列,对每一个右括号,找到在它左边最靠近它的左括号匹配,如果没有就放弃。在以这种方式把原序列匹配完成后,把剩下的未匹配的括号补全。


by data_structure @ 2021-01-18 21:08:55

这题匹配方式的确讲的不是很清楚,可以看一下来自这里的翻译:

原题目:扫描一遍原序列,对每一个右括号,找到在它左边最靠近它的左括号匹配,如果没有就放弃。

翻译:扫描一遍原序列,当找到一个右括号(即找到一个 ' ) ' 或者 ' ] ' 时),以它为起点向左找,找到一个没被标记成功匹配的左括号(即找到一个 ' ( ' 或者 ' [ ' ),如果两者匹配的话,标记它们成功 牵手 匹配,如果不匹配,或者找不到左括号的话,不做任何标记。

原题目:在以这种方式把原序列匹配完成后,把剩下的未匹配的括号补全。

翻译:上面扫描一遍标记完成功匹配的括号之后,扫描一遍序列,对于标记过的括号,则直接输出;对于没有标记的括号,则补全成对输出

举例:如果有个 ' [ ' 或 ' ] ' 没被标记匹配,则输出 [ ]

如果还不理解的话,给个测试样例:

输入:( [ ) ] )

输出:( [ ( ) ] )


by vectorwyx @ 2021-01-18 21:09:05

@啊哈编程星球 “把剩下的未匹配的括号补全”,但并没有说一定要把缺的那一半补全在未匹配括号的相邻位置啊/kk


by data_structure @ 2021-01-18 21:10:18

@vectorwyx 的确,这题题意不是很清


by vectorwyx @ 2021-01-18 21:10:32

@啊哈编程星球 emm那至少应该把这段话加进题面里吧(


by imfkwk @ 2021-01-25 00:37:21

@vectorwyx 这个时候就要用到那三条规则吧?规则的一定是成对的。

而且

现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是补全该括号序列,即扫描一遍原序列,对每一个右括号,找到在它左边最靠近它的左括号匹配,如果没有就放弃。在以这种方式把原序列匹配完成后,把剩下的未匹配的括号补全。

这一段和上面的规则

1.空序列是规则序列;

2.如果S是规则序列,那么(S)和[S]也是规则序列;

3.如果A和B都是规则序列,那么AB也是规则序列。

并没有互相吻合。

也就是说,按照规则来看,( [ ) ]并不是一个合法的序列,但是按照匹配方式来看,这却是合法的。

如果这种匹配方式都不能成立的话,那么就按照规则把不成立的补起来。这么一做就把判定和补充割裂了。

所以这道题很有点问题()。


|