题目: 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例1:
输入: "()"
输出: true
示例2:
输入: "()[]{}"
输出: true
示例3:
输入: "(]"
输出: false
示例4:
输入: "([)]"
输出: false
示例5:
输入: "{[]}"
输出: true
方案一:
1、循环字符串,将左括号压栈
2、如果是右括号,将其与栈顶字符串匹配
3、因为没有除了括号的其他字符,所以最终栈内为空
代码一:
func isValid(_ s: String) -> Bool {
var cArr = [Character]()
for c in s {
switch c {
case "{","[","(":
cArr.append(c)
case "}":
guard (!cArr.isEmpty && cArr.removeLast() == "{") else {
return false
}
case "]":
guard (!cArr.isEmpty && cArr.removeLast() == "[") else {
return false
}
case ")":
guard (!cArr.isEmpty && cArr.removeLast() == "(") else {
return false
}
default: break
}
}
return cArr.isEmpty
}
执行用时:20ms
开始的判断如下,上面优化只是减少了代码量
//最开始判断 1
if let last = cArr.last {
if last == "(" {
cArr.removeLast()
} else {
return false
}
} else {
return false
}
//最开始判断 2
if let last = cArr.removeLast() {
if last != "(" {
return false
}
} else {
return false
}
当然也可以不使用Switch case 直接 if else