/ @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;