一、描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串
例1:输入:"()"
输出:true
例2:输入:"()[]{}"
输出:true
例3:输入:"(]"
输出:false
例4:输入:"([)]"
输出:false
例5:输入:"{[]}"
输出:true
二、算法
思路:利用栈先进后出的思想
1、遍历字符串的字符,遇到开括号,则入栈,稍后去匹配,遇到闭括号,检查栈顶元素是否是一个相同类型的左括号,是则该栈顶元素出栈,并继续处理,否则该字符串不是有效的
2、如果遍历完字符串,栈中仍有元素,则字符串不是有效的
时间复杂度:O(n)
具体实现:
func isValid(_ s: String) -> Bool {
if s.count == 0{
return true
}
var arr : [Character] = []
//遍历字符串
for i in s {
//判断字符是否是右括号,若是则判断栈顶元素是否是同一类型的左括号
if i == ")" {
if arr.popLast() != "("{
return false
}
}else if i == "]" {
if arr.popLast() != "[" {
return false
}
}else if i == "}" {
if arr.popLast() != "{" {
return false
}
}else{
//不是右括号则入栈
arr.append(i)
}
}
//栈中元素为0则有效,反之无效
return arr.count == 0
}