题目描述
给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
数据范围:字符串长度 0\le n \le 100000≤n≤10000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
代码实现
import java.util.*
object Solution {
/**
* 方法:栈(推荐使用)
* step 1:创建辅助栈,遍历字符串。
* step 2:每次遇到小括号的左括号、中括号的左括号、大括号的左括号,就将其对应的呦括号加入栈中,期待在后续遇到。
* step 3:如果没有遇到左括号但是栈为空,说明直接遇到了右括号,不合法。
* step 4:其他情况下,如果遇到右括号,刚好会与栈顶元素相同,弹出栈顶元素继续遍历。
* step 5:理论上,只要括号是匹配的,栈中元素最后是为空的,因此检查栈是否为空即可最后判断是否合法。
*
* 时间复杂度:O(n)O(n)O(n),其中nnn为字符串长度,遍历整个字符串
* 空间复杂度:O(n)O(n)O(n),最坏情况下栈空间中记录整个字符串长度的右括号
*
* @param s string字符串
* @return bool布尔型
*/
open fun isValid(s: String): Boolean {
//辅助栈
val st = Stack<Char>()
//遍历字符串
for (i in 0 until s.length) {
//遇到左小括号
if (s[i] == '(') st.push(')')
else if (s[i] == '[') st.push(']')
else if (s[i] == '{') st.push('}')
else if (st.isEmpty() || st.pop() != s[i]) return false
}
//栈中是否还有元素
return st.isEmpty()
}
@JvmStatic
fun main(args: Array<String>) {
println(isValid("{{{}}}}}"))
}
}