https://leetcode-cn.com/problems/valid-parentheses/
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
解题关键:因为不能仅从左右括号个数判断,还要判断相对顺序(示例4),必须选择恰当的数据结构(栈)。
bool isValid(char* s) {
int length = 0;
int rear = 0; //栈尾指针
char *p=NULL;
if(s=='\0') return true; //排除特殊情况
while(s[length]!='\0'){
length++;
}
p = (char *)malloc(sizeof(char)*(length)); //申请数组作为栈
if(length%2!=0 || s[0]=='}' || s[0]==']' || s[0]==')') return false; //排除特殊情况
for(int i=0;s[i] != '\0'; i++){
if(s[i]=='('||s[i]=='{'||s[i]=='['){ //左括号入栈
p[rear++] = s[i];
if(rear>length/2){ //若栈长度超过length/2则必定存在不配对括号
free(p);
return false;
}
}
else if(s[i]==')' || s[i]==']' || s[i]=='}'){
switch(s[i]){
case ')':
if(p[rear-1]=='('){ //将右括号与栈顶匹配,若不同则错误
rear-=1;
}
else{
free(p);
return false;
}
break;
case '}':
if(p[rear-1]=='{'){
rear-=1;
}
else{
free(p);
return false;
}
break;
case ']':
if(p[rear-1]=='['){
rear-=1;
}
else{
free(p);
return false;
}
break;
}
}
}
free(p);
return rear==0; //若最后全部出栈,则式子有效
//8ms 4.4MB 时间复杂度O(n) 空间复杂度O(n)
}