description

Given a string s containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.
  3. Every close bracket has a corresponding open bracket of the same type.

 

Example 1:

Input: s = "()"

Output: true

Example 2:

Input: s = "()[]{}"

Output: true

Example 3:

Input: s = "(]"

Output: false

Example 4:

Input: s = "([])"

Output: true

Example 5:

Input: s = "([)]"

Output: false

 

Constraints:

  • 1 <= s.length <= 104
  • s consists of parentheses only '()[]{}'.

submission

impl Solution {
    // use a stack for matching pairs    
    pub fn is_valid(s: String) -> bool {
        fn is_match(open: char, close: char) -> bool {
            match (open, close) {
                ('[', ']') | ('(', ')') | ('{', '}') => true,
                _ => false,
            }
        }
        let mut stack = vec![];
        for ch in s.chars() {
            match ch {
                // open brackets, push to stack
                '(' | '[' | '{' => stack.push(ch),
                // close brackets, check stack top
                close => match stack.pop() {
                    None => return false,
                    Some(open) => if !is_match(open, close) {
                        return false;
                    }
                }
            }
        }
        // check stack for unmatching open brackets
        stack.is_empty()
    }
}