题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
思路
对于这种两个一对的匹配问题,使用栈来做应该可以使得思路清晰不少,栈规则是遇到左半括号就把括号入栈,遇到右半括号就取出栈顶元素,看是否与当前右半括号匹配
源代码及注释
bool isValid(char * s) {
int len = strlen(s);
/**
* 边界情况,只有一个字符必定返回false
*/
if(len%2 == 1)return false;
/**
* 栈空间只需要原字符串长度的一半多1就可以满足了,因为如果栈满了,说明原字符串有超过一半的左半括号,
* 所以一定有些右半括号不匹配,此时可以直接返回false
*/
char a[len/2+1];
/**
* 字符数组,毕竟是C语言,还是给个初值好了,相当于a[0] = '\0'
*/
a[0] = 0;
/**
* i是字符串索引,front是栈顶索引
*/
int i = 0, front = 0;
while(s[i]) {
switch (s[i]) {
/**
* 左半括号入栈,同时判断栈是否已满
*/
case '(':
case '{':
case '[': {
a[front++] = s[i++];
if(front == len/2+1) {
return false;
}
break;
}
/**
* 右半括号,栈空或是栈顶元素不匹配直接返回false,否则栈顶元素出栈
*/
case ')': {
if(front == 0 || a[front-1] != '(') {
return false;
}
--front;
++i;
break;
}
case '}': {
if(front == 0 || a[front-1] != '{') {
return false;
}
--front;
++i;
break;
}
case ']': {
if(front == 0 || a[front-1] != '[') {
return false;
}
--front;
++i;
break;
}
}
}
/**
* 所有字符已经遍历完全后,如果栈空返回true,否则返回false
*/
if(front == 0) {
return true;
}
return false;
}