/**
* @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+=1)//遍历栈
{
const c=s[i];//拿到了字符串的字符
if(c==='('||c==='['||c==='{')//如果是小中大括号的话,进栈
{//遇到左括号
stack.push(c);//进
}
else//要出栈的地方右括号
{//判断右括号与栈顶元素匹配
const t=stack[stack.length-1];//栈顶,先看看栈顶,然后是
if((t==='('&&c===')')||(t==='['&&c===']')||(t==='{'&&c==='}'))//看看栈顶是否与
{
stack.pop();
}
else
{
return false;
}
}
}
return stack.length===0;//栈空就不会false了
};
规律:如果在只有左括号的情况下,如果要闭合的话,越靠后的左括号对应的右括号就越靠前。越靠前的左括号对应的右括号就越靠后。
{[]}
解题步骤:
问题?
为什么要用栈解决?
核心:越靠后的左括号对应的右括号就越靠前。越靠前的左括号对应的右括号就越靠后。
因为比如{[]}的话,左大括号在最前面,但是却是最后一位出来的。
左中括号在前面,右中括号却是先出来的。
新建一个栈?
为什么,因为还没有栈呢,没有用什么啊。
扫描字符串,为什么?
因为不扫描做什么啊。
栈顶?
数组的最后一位。
如果右括号与栈顶(最后一位)匹配?什么意思?
记住哈,栈顶是进入栈的最后一位啊,也就是最前面的把,也可以叫做左括号把,与右括号匹配就行,不然不合法。如果最后栈空了就代表全部匹配完成就行,不然不行的。
核心是:越靠后的左括号对应的右括号就越靠前。越靠前的左括号对应的右括号就越靠后。
比如是这样的啊。
问题?
如果字符数是偶数还能判断吗?
不能,为什么,因为不能完全匹配就是false的.
if(s.length%2=1)//如果输入的字符为偶数的话,就算了
{
return false;
}
问题?
第一先什么?
先遍历,然后是获取所有的字符,。
进栈的是什么?
左括号。
右括号要进栈吗?
不需要,为什么,因为他只是用来匹配用的啊.
不需要进栈。
而且代码中没有代码是进栈的啊。
栈顶是什么?
最后一位数组,那是什么?
是栈开头的哪一个.
也就是左括号.
问题:
c为什么是右括号?
因为c代表了所有的字符,而且c中的所有的左括号都入栈了,只剩下右括号了啊
if((t===’(’&&c===’)’)||(t===’[’&&c===’]’)||(t===’{’&&c===’}’))//看看栈顶是否与左括号匹配,
{
stack.pop();
}
什么意思?
如果栈顶与右括号匹配就出栈.也即是说开头的与从什么开始的右括号匹配就欧克了。
i=0开始length-1结束。
如果没有匹配的就false。
如果字符里没有字符的话,就说明length为0;