有效的括号(C, Python)
1. 题目描述
难度:简单
2. 题目分析
这道题咋一看挺简单的,但是请注意观察这两个示例:
- 示例2, 示例4
刚开始的时候我想利用双指针法来对字符串进行判断,一个首指针,一个尾指针,如果字符串首尾相同,那么就输出true。但是示例2不符合该想法。
然后想着统计正括号和反括号的数量是否一致并且反括号要在正括号的右边,但是示例4满足该算法,但是示例4是错误的。
该题目最佳的算法就是利用栈的数据结构来进行判断:
- 栈(C语言)
依次将字符放入栈中,并判断放入的字符是否和栈首的字符构成一对,如果是一对,将栈首的字符弹出。如果不是一对,将该字符压入栈中。最终判断栈中是否还有元素,如果有,那么就是输出false,如果栈是空的,就输出为true。时间复杂度为O(n)。 - 删除法(Python)
如果字符串中有成对的括号比如"()", “{}”, “[]”,将该对括号删除,然后继续检查剩下的字符串,如果最终字符串为空,那么就输出true,否则输出false。
3. C语言实现
代码如下:
// 返回括号对应的值
int returnValue(char s){
char type[] = {'(', ')', '{', '}', '[', ']'};
int flag[] = {1, -1, 10, -10, 100, -100};
for(int i = 0; i < 6; i++){
if(s == type[i]) return flag[i];
}
return 0;
}
// 模拟栈的方法
bool isValid(char * s){
// index指向栈首
int index = 0;
int value;
int len = strlen(s);
// 如果空字符串,返回1
if(len == 0) return 1;
// 如果字符串长度为奇数,返回0
if(len % 2 != 0) return 0;
// 申请栈的空间
int* stack = (int *)malloc(sizeof(int)*len);
// 赋值栈尾元素
stack[0] = returnValue(s[0]);
for(int i = 1; i < len; i++){
value = returnValue(s[i]);
// 如果栈为空,将值放入栈
if(index==-1){
index++;
stack[index] = value;
}
// 如果栈不为空进行判断
else{
// 如果遍历的元素的值与栈首的值相加为0,将栈首元素弹出
if(value + stack[index] == 0)
index--;
// 否则,将遍历的元素的值压如栈中
else{
index++;
stack[index] = value;
}
}
}
free(stack);
return index == -1? 1:0;
}
输出结果为:
4. Python语言实现
代码如下:
class Solution:
def isValid(self, s):
while '{}' in s or '()' in s or '[]' in s:
s = s.replace('{}', '')
s = s.replace('[]', '')
s = s.replace('()', '')
return s == ''
输出结果为: