题目描述: 给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串,判断字符串是否有效。
有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
栈的典型应用,碰到左括号入栈,碰到右括号出栈进行匹配,全部匹配成功了就是有效的括号。
常规写法,使用switch-case匹配。
//C语言
bool isValid(char * s){
char strStack[strlen(s) + 1];
int i = 0, top = -1;
while(s[i] != ‘\0‘){
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;
};
原文:https://www.cnblogs.com/JesseyWang/p/12964210.html