20. 有效的括号
Posted jesseywang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20. 有效的括号相关的知识,希望对你有一定的参考价值。
题目描述: 给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串,判断字符串是否有效。
有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
栈的典型应用,碰到左括号入栈,碰到右括号出栈进行匹配,全部匹配成功了就是有效的括号。
常规写法,使用switch-case匹配。
//C语言 bool isValid(char * s){ char strStack[strlen(s) + 1]; int i = 0, top = -1; while(s[i] != ‘ ‘){ switch(s[i]){ case ‘(‘: strStack[++top] = ‘(‘; break; case ‘[‘: strStack[++top] = ‘[‘; break; case ‘{‘: strStack[++top] = ‘{‘; break; case ‘)‘: if(top != -1 && strStack[top] == ‘(‘) --top; else return false; break; case ‘]‘: if(top != -1 && strStack[top] == ‘[‘) --top; else return false; break; case ‘}‘: if(top != -1 && strStack[top] == ‘{‘) --top; else return false; break; default: break; } i++; } return top == -1; } //JS /** * @param {string} s * @return {boolean} */ var isValid = function(s) { let stackArr = []; for(let i = 0; i < s.length; i++){ if(s[i] == ‘(‘ || s[i] == ‘[‘ || s[i] == ‘{‘) stackArr.push(s[i]); else if(stackArr.length == 0) return false; else switch(s[i]){ case ‘)‘: if(stackArr.pop() != ‘(‘) return false; else break; case ‘]‘: if(stackArr.pop() != ‘[‘) return false; else break; case ‘}‘: if(stackArr.pop() != ‘{‘) return false; else break; } } return stackArr.length == 0; };
优化解法,借助ASCII,()的ASCII差1 []{}的ASCII差2,只要判断栈内和栈外的字符ASCII码差值即可。
//C bool isValid(char * s){ //空字符串显然符合 if(*s == 0) return true; char stack[strlen(s)]; int top = -1; for(int i=0; i<strlen(s); ++i){ //如果是左括号们,欢迎入栈 if(s[i] == ‘(‘ || s[i] == ‘[‘ || s[i] == ‘{‘) stack[++top] = s[i]; //不是左括号们,如果栈空则无法配对,不符合 else if(top == -1) return false; //不是左括号们,栈非空,当前和栈顶配对,符合 else if(s[i] == stack[top]+1 || s[i] == stack[top]+2) stack[top--] = 0; //()的ASCII差1 []{}的ASCII差2 //不是左括号们,栈非空,当前和栈顶不配对,不符合 else return false; } //最后栈为空则符合,不为空则不符合 return top == -1; } //JS /** * @param {string} s * @return {boolean} */ var isValid = function(s) { let stackArr = [], popStr = ‘‘; for(let i = 0; i < s.length; i++){ if(s[i] == ‘(‘ || s[i] == ‘[‘ || s[i] == ‘{‘) stackArr.push(s[i]); else if(stackArr.length == 0) return false; else{ popStr = stackArr.pop(); if(s[i].charCodeAt() == popStr.charCodeAt() + 1 || s[i].charCodeAt() == popStr.charCodeAt() + 2) continue; else return false; } } return stackArr.length == 0; };
以上是关于20. 有效的括号的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第11天 | ● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值