题干
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
实例:
输入:s = "()[]{}"
输出:true
复制代码
输入:s = "([)]"
输出:false
复制代码
解法:栈的特性
实际上我们可以先将字符串遍历一遍,然后在遍历的同时,如果我们遇到的是左括号,将其置入栈中,然后再将如果遍历到的是右括号,则使其于栈顶元素相比较,如果与之匹配,则移除栈顶元素,以此类推,如果遍历到的右括号于栈顶元素不等,可以直接返回false,因为这是括号的特性。最后遍历完以后看我们的栈是否为空,如果为空则说明符合我们的要求,如果不为空,则返回false
注意:我们不需要将右括号置入栈中,右括号只是用来比较的。
代码实现:
执行用时:76 ms, 在所有 JavaScript 提交中击败了95.12%的用户
内存消耗:39.3 MB, 在所有 JavaScript 提交中击败了25.41%的用户
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
// 遍历字符串,使每一个左括号都在栈顶,然后当遇到右括号时,判断他与最近的栈顶对不对应,如果对应就匹配成功,移除栈顶元素即可
let stack = [];
for (let i = 0; i < s.length; i++) {
if (s.charAt(i) === '[' || s.charAt(i) === '(' || s.charAt(i) === '{') {
stack.push(s.charAt(i))
} else {
if (stack.length == 0) {
return false
}
let lastcode = stack.length - 1
if (s.charAt(i) === ')' && stack[lastcode] === '(' || s.charAt(i) === '}' && stack[lastcode] === '{' || s.charAt(i) === ']' && stack[lastcode] === '[') {
stack.pop()//如果匹配成功移除栈顶元素
}else{
return false
}
}
}
return stack.length===0
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END