给定一个只包括 `'('` ,`')'` ,`'{'` ,`'}'` ,`'['` ,`']'` 的字符串,判断字符串是否有效。 有效字符串需满足: - 左括号必须用相同类型的右括号闭合。 - 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 **示例 1:** ```js 输入: "()" 输出: true ``` **示例 2:** ```js 输入: "()[]{}" 输出: true ``` **示例 3:** ```js 输入: "(]" 输出: false ``` **示例 4:** ```js 输入: "([)]" 输出: false ``` **示例 5:** ```js 输入: "{[]}" 输出: true ``` 附赠leetcode:[leetcode](https://leetcode-cn.com/problems/valid-parentheses/solution/teng-xun-leetcode20you-xiao-de-gua-hao-by-user7746/)
Activity
7777sea commentedon Apr 23, 2020
fanefanes commentedon Apr 23, 2020
方法:
检测这个字符串,是否符合一个完整出入栈流程,
'(','{','[' 这类字符串为入栈 stack.push(),
')','}',']' 这类字符串为出栈 stack.pop(),
当执行结束stack.length = 0 时,return true
时间复杂度O(n), 空间复杂度O(n)
代码就是楼上的for 循环解释
13001920223 commentedon Apr 23, 2020
sisterAn commentedon Apr 23, 2020
解答:利用栈结构
解题思路: 将字符串中的字符依次入栈,遍历字符依次判断:
{、(、[,直接入栈}、)、]中的一种,如果该字符串有效,则该元素应该与栈顶匹配,例如栈中元素有({, 如果继续遍历到的元素为), 那么当前元素序列为({)是不可能有效的,所以此时与栈顶元素匹配失败,则直接返回false,字符串无效当遍历完成时,所有已匹配的字符都已匹配出栈,如果此时栈为空,则字符串有效,如果栈不为空,说明字符串中还有未匹配的字符,字符串无效
画图帮助理解一下:
代码实现:
时间复杂度:O(n)
空间复杂度:O(n)
leetcode
[-]腾讯&leetcode20:有效的括号[/-][+]图解腾讯&leetcode20:有效的括号[/+][-]图解腾讯&leetcode20:有效的括号[/-][+]图解腾讯&哔哩哔哩&leetcode20:有效的括号[/+]zero9527 commentedon Apr 30, 2020
qianlongo commentedon Aug 22, 2020
yucheng-yc commentedon Nov 18, 2020
作了套面试题,我的解法如下
题目:
第一题(20分):给定一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,请使用JavaScript实现一个函数
function testFn(str){...}, 检查该字符串的括号是否成对出现。
例如:
“(a[b(c)d]e{f}g)” //true
“(a[b(cd]e{f}g))” //false
“(a[b(c)d]e{f}” //false
解法:
function testFn(str){
if(!str.length) {
return true
}
let resStr = str.replace(/[^{}[]()]/ig,"")
if(resStr.length%2===0) {
const length = resStr.length
for(let i = 0;i<length/2;i++) {
resStr= resStr.replace(/([])|(())|({})/ig,"")
console.log('resStr',i, resStr)
}
return !resStr
}
console.log(testFn('(a[b(c)d]e{f}g)'))
console.log(testFn('(a[b(cd]e{f}g))'))
console.log(testFn('(a[b(c)d]e{f}'))
AnranS commentedon Nov 18, 2020
z253573760 commentedon Feb 3, 2021
JohnApache commentedon Apr 29, 2021
利用栈保存读取到的字符,判断是否为有效,只需判断当出现反向符号的时候,栈顶符号一定是对应的正向符号,如果是,就推出栈顶符号,继续遍历,如果不是直接返回false,
self-transition commentedon May 13, 2022
AlexZhang11 commentedon May 31, 2024
let mapBrackets = { "(":")", "[":"]", "{":"}", } function validBrackets(str){ let stack = [] for(let i = 0;i<str.length;i++){ let c = str.charAt(i) if(['(','{','['].includes(c)){ stack.push(mapBrackets[c]) }else if(!stack.length||stack.pop()!=c){ return false } } return !stack.length } console.log(validBrackets("()")) console.log(validBrackets("()[]{}")) console.log(validBrackets("(]")) console.log(validBrackets("([)]")) console.log(validBrackets("{[]}"))