class Solution:
    def isValid(self, s: str) -> bool:
        def rcg_type(ch) -> int:
            if ch[0] =='(':
                return 1
            if ch[0] ==')':
                return 2
            if ch[0] =='{':
                return 3
            if ch[0] =='}':
                return 4
            if ch[0] =='[':
                return 5
            if ch[0] ==']':
                return 6
        stack = []
        top_idx = -1
        def is_empty():
            return top_idx == -1
        def set_ele(stack: list, idx: int, ele: int):
            if len(stack) <= idx:
                stack.append(ele)
            else:
                stack[idx] = ele
        for ch in s:
            tp = rcg_type(ch)
            if tp % 2 == 1:
                top_idx += 1
                set_ele(stack, top_idx, tp)
            else:
                if is_empty(): return False
                top_ele = stack[top_idx]
                if tp - top_ele != 1: return False
                top_idx -= 1
        if not is_empty(): return False
        return True
    
sol = Solution()
print(sol.isValid("()"))
print(sol.isValid("(){}[]"))
print(sol.isValid("(]"))
print(sol.isValid("[(])"))