给定一个只包括 ‘(‘,’)’,'{‘,’}’,'[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
链接:leetcode-cn.com/problems/va…
解题思路
对于没有闭合的左括号而言,越靠后的左括号,对应的右括号越靠前。
满足后进先出,使用栈。
解题步骤
- 新建一个栈
- 扫描字符串,遇到左括号入栈,遇到和栈顶括号类型匹配的右括号就出栈,类型不匹配直接判定不合法
- 最后栈空了就合法,否则不合法
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if(s.length % 2 === 1) return false; //这里做了个优化,如果为奇数直接判定不合法并且返回
const stack = []
for(let i=0;i<s.length;i++){
const c = s[i]
if(c === '(' || c === '[' || c === '{'){
stack.push(c)
}else {
let t = stack[stack.length-1]
if(
(t === "(" && c === ')') ||
(t === '[' && c === ']') ||
(t === '{' && c === '}')
) {
stack.pop()
} else {
return false
}
}
}
return stack.length === 0
};
复制代码
时间复杂度和空间复杂度
时间复杂度O(n) 空间复杂度O(n)
用map优化代码
可以将左右括号表现为键值对,代码如下:
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if(s.length % 2 === 1) return false;
const stack = []
const map = new Map()
map.set("(",")")
map.set("[","]")
map.set("{","}")
for(let i=0;i<s.length;i++){
const c = s[i]
if(map.has(c)){
stack.push(c)
}else {
let t = stack[stack.length-1]
if(
map.get(t) === c
) {
stack.pop()
} else {
return false
}
}
}
return stack.length === 0
};
复制代码
时间复杂度和空间复杂度
时间复杂度O(n) 空间复杂度O(n)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END