20. Valid Parentheses

71 阅读1分钟

题目描述

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.

Example 1:
Input: "()"
Output: true

Example 2:
Input: "()[]{}"
Output: true

Example 3:
Input: "(]"
Output: false

Example 4:
Input: "([)]"
Output: false

Example 5:
Input: "{[]}"
Output: true

解题思路

这个题目使用栈的特性做会非常简单, 当我们遍历到一个左括号是,入栈, 遍历到右括号时, 将栈顶的第一个元素取出来对比, 如果栈顶的元素跟当前元素是一对括号, 就弹出栈顶元素,继续循环, 否则就可以直接判断出括号不匹配, 当循环结束时, 如果栈为空, 就说明所有的左括号都匹配到了
时间复杂度: O(n)

示例代码

func defineIsLeftAndMatchChar(_ char: Character) -> Int {
    // 大于0 为左括号
    switch char {
        case "(":
            return 1
        case ")":
            return -1
        case "{":
            return 2
        case "}":
            return -2
        case "[":
            return 3
        case "]":
            return -3
        default:
            return 0
    }
}

func isValid(_ s: String) -> Bool {

    let strArray = Array(s)
    var stackArray = [Character]()
    for item in strArray.enumerated() {
        let target = defineIsLeftAndMatchChar(item.element)
        if target > 0 { // 左括号
            stackArray.append(item.element)
        }else {

            guard let last = stackArray.last else { return false }

            let tempTarget = defineIsLeftAndMatchChar(last)

            if target != -tempTarget {
                return false
            }else {
            let _ = stackArray.removeLast()
            }
        }
    }
    return stackArray.count == 0
}