设置两个stack,记录做括号和右括号,做括号入左stack,遇到右括号时,如果做括号stack有可用做括号,弹出,没有,说明当前右括号非法。遍历结束后,查看有多少做括号非法,然后将其中一半(记得向上取整,否则比如右3个做括号,3/2,只交换1组非法左右括号,还是不平衡,向上取整,对于偶数个非法做括号,刚好换一半,对于奇数个,刚好交换其一半向上取整个,比如3个,换两个,5个换3个)。
class Solution:
def minSwaps(self, s: str) -> int:
N = len(s)
stackleft = []
stackright = []
res = 0
rightcount = 0
for idx in range(0, N):
if s[idx] == ']':
if stackleft:
stackleft.pop(-1)
elif s[idx] == '[':
stackleft.append(s[idx])
illegal = len(stackleft)
res = math.ceil(illegal/2)
return res