C代码
char pair_chr(char a) {
switch(a) {
case '(':
return ')';
case '[':
return ']';
case '{':
return '}';
}
return 0;
}
bool isValid(char * s){
char stack[5120] = {0};
int size = 0;
if (s == NULL)
return false;
while(s != NULL && *s != '\0') {
if(size > 0) {
if (pair_chr(stack[size-1]) == *s) {
size--;
s++;
continue;
}
} else {
if (pair_chr(*s) == 0) {
return false;
}
}
stack[size++] = *s;
s++;
}
return size == 0;
}
思路
有效的括号的特点:
- 成对存在;
- 栈式嵌套,所以本题考虑使用stack的方案进行匹配解答;
注意点
- 暂无
结果
题目
二刷
C代码
char getPair(const char c) {
switch(c) {
case '(':
return ')';
case '[':
return ']';
case '{':
return '}';
}
return '\0';
}
int isRight(const char c) {
switch(c) {
case ']':
case ')':
case '}':
return 1;
default:
return 0;
}
return 0;
}
bool isValid(char * s){
char stack[5120] = {0};
int top = -1;
int i;
int len;
len = strlen(s);
if (len < 2) {
return false;
}
for (i = 0; i < len; i++) {
if(isRight(s[i]) == 1) {
if(top == -1)
return false;
if(getPair(stack[top]) != s[i])
return false;
top--;
} else {
top++;
stack[top] = s[i];
}
}
if(top != -1) {
return false;
}
return true;
}
注意点
- 左右括号的处理逻辑一定要分开要么在
top--后continue
,要么直接分成else分支
,避免逻辑处理错误; - 如果stack不为空,说明存在未完成匹配的括号,所以需要返回失败;
三刷
C代码
char getPair(char c) {
switch(c) {
case ')':
return '(';
case ']':
return '[';
case '}':
return '{';
}
return 0;
}
bool isValid(char * s){
char stack[4096] = {0};
char tmp;
int i = -1;
while(s != NULL && *s != '\0') {
tmp = getPair(*s);
if (tmp == 0) {
++i;
stack[i] = *s;
} else {//右边的符号
if (i < 0)
return false;
if(tmp == stack[i]) {
stack[i] = 0;
--i;
} else {
return false;
}
}
s++;//注意点1:字符串的遍历迭代
}
if (i != -1)
return false;
return true;
}