fork download
  1. def check(input_string):
  2. stack = []
  3. brackets = { '{': '}', '(': ')', '[': ']' }
  4. brackets_rev = {v: k for k, v in brackets.items()}
  5. for idx, ch in enumerate(input_string):
  6. if ch in brackets:
  7. stack.append(ch)
  8. elif ch in brackets_rev:
  9. if not stack:
  10. return False, 'Closing parenthesis without open one at {0}'.format(idx)
  11.  
  12. if stack.pop(-1) != brackets_rev[ch]:
  13. return False, 'Invalid bracket at idx {0}: "{1}" (expected "{2}")'.format(idx, ch, brackets_rev[ch])
  14.  
  15. if stack:
  16. return False, 'Unbalanced: {0}'.format(', '.join(stack))
  17. return True, None
  18.  
  19. print(check("()"))
  20. print(check("[{}]()"))
  21. print(check("({)[}]"))
Success #stdin #stdout 0.02s 5852KB
stdin
Standard input is empty
stdout
(True, None)
(True, None)
(False, 'Invalid bracket at idx 2: ")" (expected "(")')