You can find the problem here and try to solve it by yourself.

Follows my solution and then a concise explanation.

```
def isBalanced(s):
""" Checks if s contains balanced brackets.
:returns: 'Yes' if s is balanced otherwise 'NO'
:rtype: str
"""
parentheses = {
'{': 1,
'[': 2,
'(': 3,
'}': -1,
']': -2,
')': -3
}
stack = []
for elem in s:
elem = parentheses[elem]
if elem > 0:
stack.append(elem)
else:
try:
valore = stack.pop()
except:
return 'NO'
if valore + elem == 0:
pass
else:
return 'NO'
if len(stack) == 0:
return 'YES'
else:
return 'NO'
```

Let’s explain the logic of this function. First of all I have used a dictionary structure to map parentheses to integers, just to avoid working with strings.

The method *isBalanced* takes a string *s* of open and closed parentheses that match the ones in the dictionary *parentheses*.
There is an array variable *stack* where an open parentheses is added, while a closed one is removed. There is a *try-except* because if the parentheses are not matched then the string in input in not balanced and so a *NO* message is printed. The line `if valore + elem == 0`

is required because there may be the case in which there is an open round bracket and a closed brace, so in this case we should also return *No*.
A *Yes* message is returned when the stack is empty and no unmatching open and closed parentheses are found.

×