```
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
matching = set([('(', ')'), ('[', ']'), ('{', '}')])
opening = set(['(', '[', '{'])
brackets = []
if len(s)%2 == 1:
return False
for paren in s:
if paren in opening:
brackets.append(paren)
else:
if brackets:
popped = brackets.pop()
if (popped, paren) not in matching:
return False
else:
return False
if len(brackets) != 0:
return False
return True```
The code uses sets to keep track of the matching parentheses and uses a stack called brackets to ensure that every closing parentheses has a valid opening one.
```