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也是规则序列。
并没有互相吻合。
也就是说,按照规则来看,( [ ) ]并不是一个合法的序列,但是按照匹配方式来看,这却是合法的。
如果这种匹配方式都不能成立的话,那么就按照规则把不成立的补起来。这么一做就把判定和补充割裂了。
所以这道题很有点问题()。