Article start
DSA Course: Interview Patterns and Problem Solving
Module 4: Stack & Queue

Valid Parentheses: Stack matching Pattern

Use a stack to match every closing bracket with the most recent opening bracket.

May 28, 2026·33

Learning Outcome

After this lesson, you should be able to explain why nested bracket problems need last-in-first-out matching.

Problem Statement

Given a string containing only bracket characters ()[]{}, return true if every opening bracket is closed by the same type of bracket in the correct order.

InputOutputWhy
"{[()]}"trueEvery close matches the most recent open.
"([)]"falseThe close order is wrong.

Brute Force Approach

Repeatedly remove adjacent valid pairs like (), [], and {} until no more pairs can be removed. If the string becomes empty, it is valid.

This proves the nesting idea, but repeated string edits can be slow and clumsy.

Optimized Approach

Push opening brackets onto a stack. When a closing bracket appears, the stack top must be the matching opening bracket. If the stack is empty or the type does not match, return false.

Exact Pseudocode

stack = empty stack
pairs = map closing bracket to opening bracket
for char in s:
  if char is opening bracket:
    push char
  else:
    if stack is empty or stack.top != pairs[char]:
      return false
    pop stack
return stack is empty

Reference Code

class Solution:
    def isValid(self, s):
        stack = []
        pairs = {')': '(', ']': '[', '}': '{'}

        for ch in s:
            if ch in pairs:
                if not stack or stack[-1] != pairs[ch]:
                    return False
                stack.pop()
            else:
                stack.append(ch)

        return len(stack) == 0

Sample Dry Run

charstack beforeActionstack after
{[]Push opening[{]
[[{]Push opening[{, []
([{, []Push opening[{, [, (]
)[{, [, (]Top matches, pop[{, []
], }Remaining opensBoth match and pop[]

Complexity

MeasureValueReason
TimeO(n)Each bracket is pushed or popped at most once.
SpaceO(n)The stack may store all opening brackets.

Edge Cases

  • Closing bracket appears before any opening bracket.
  • Unclosed opening brackets remain at the end.
  • Wrong nesting order such as "([)]".

Interview Checklist

  • Use stack because the latest opening bracket must close first.
  • Check empty stack before reading the top.
  • At the end, require the stack to be empty.

FAQs

Why does a stack fit bracket matching?

Nested brackets close in reverse order, which is exactly last-in-first-out behavior.

Should unmatched opening brackets return false?

Yes. A non-empty stack at the end means something was never closed.

What is the core pattern?

Stack-based matching.

Test your knowledge

Take a quick quiz based on this chapter.

Discussion

0 comments

Sign in to share a question or add to the discussion.
Start the discussion

Ask a question or share what stood out to you.