题目
题解
这道题采用 栈 的方式做比较简洁。利用栈的先入后出的特性,遇到左括号就入栈,遇到右括号就出栈进行匹配比较。其中,匹配可以采用一个哈希表,这里用一个函数实现,左键为右括号,右键为对应的左括号,如果不是右括号或者匹配不上就返回0。
注意,可以首先排除strlen(s)为奇数的,肯定不满足要求。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char pairs(char a)
{
if(a=='}')return '{';
if(a==']')return '[';
if(a==')')return '(';
return 0;
}
bool isValid(char * s){
int n=strlen(s);
if(n%2==1)return false;
char stk[n+1]={0};
int top=0;
for(int i=0;i<n;i++)
{
char ch=pairs(s[i]);
if(ch)//右括号进行匹配
{
if(top==0||stk[top-1]!=ch)
{
return false;
}
top--;
}
else{
stk[top++]=s[i];//左括号入栈
}
}
return top==0;//top为0说明所有括号正确成对,返回true,否则false
}
这题栈的做法很容易想到,亮点在于第一个配对函数的使用(哈希表)。