题目大意:
现有n个字符串,每个串均有若干个()左右括号构成,请你选择一个连接顺序将这些串连在一起,使得匹配的括号对数最多。
括号匹配的定义为左括号在右括号左边,每个括号均有一次参与匹配的机会。
解题思路:
首先在输入时对串进行处理,将已经匹配的记录下来,这样剩下的串只有4种情况:1.空串 2.只有左括号 3.只有右括号 4.右括号和左括号的混合 && 右括号一定在左括号前边
。
首先第1种情况肯定不用管了,剩下的该如何安排他们的顺序使得配对的数目最大化呢?肯定是要左括号尽量往左靠,右括号尽量往右靠,这样第2、3种情况也解决了。
最后一种是情况最多的,可以分为 (1).右括号数 > 左括号数 (2).左括号数 > 右括号数 以及 (3).左括号数 == 右括号数。
考虑我们最初的目的,左括号尽量往左是为了什么?是为了不“浪费”这些括号,但是当必须“牺牲”一部分括号时,应当将“浪费”降到最低。于是我们找出了排序的关键字key = 左括号数 - 右括号数。两个变量相比较共四种情况:1.key1 > 0 && key2 > 0 2.key1 > 0 && key2 < 0 3.key1 < 0 && key2 > 0 4.key1 < 0 && key2 < 0
,再将相等的情况随便插到几组中所有情况就都有了。这时排序的规则是一正一负正的在前,都为正时右括号少的在前,都为负时左括号多的在前
,根据这样排完序挨个取就可以了。
Mycode:
1 |
|