CodingNeed.
Fresher · Stacks & queues

Valid Parentheses

Given a string containing only (), {}, and [], determine whether every opening bracket is closed in the correct order. The empty string is valid.

Examples

s = "()[]{}" → true
s = "([)]" → false

Compare approaches

Repeated reduction

Repeatedly remove matched adjacent pairs until no changes remain.

Time: O(n²) · Space: O(n)

function isValid(s) {
  let before;
  do {
    before = s;
    s = s.replace(/\(\)|\[\]|\{\}/g, "");
  } while (before !== s);
  return s.length === 0;
}
Stack

A stack matches each closing bracket with the latest opening bracket.

Time: O(n) · Space: O(n)

function isValid(s) {
  const stack = [];
  const pairs = { ")": "(", "]": "[", "}": "{" };
  for (const c of s) {
    if ("([{ ".trim().includes(c)) stack.push(c);
    else if (stack.pop() !== pairs[c]) return false;
  }
  return stack.length === 0;
}

Common traps

  • Reject a closing bracket when the stack is empty.
  • A non-empty stack at the end is invalid.
Practise in the workspace →

Essential cookies keep your account signed in. Optional analytics is not configured on this site. Your choice does not affect access to lessons.

Read the Privacy Policy. You can change this choice in the footer.