题目描述
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
}