目录
一、题目描述
二、初次解答
1. 思路:使用数组模拟栈。循环遍历给定的char型数组s,遇到左类型括号则入栈,否则出栈并且判断出栈元素与当前的s[i]是否匹配。(注意:遇到右类型括号时需要判定栈是否为空!)
2. 代码:
bool isValid(char* s) { char stack[10000];//数组模拟栈 int i = 0; //s数组的索引 int j = -1; //栈的索引 //循环遍历数组s, 若为左类型则入栈, 若为右类型则出栈并对比匹配性 while(s[i] != '\0'){ if (s[i] == '(' || s[i] == '[' || s[i] == '{') {//入栈 stack[++j] = s[i]; } else { //出栈时栈内无元素,则false if (j == -1) return false; //出栈,对比出栈的元素和当前元素是否匹配 char tmp = stack[j--]; if (tmp == '(' && s[i] != ')') return false; if (tmp == '[' && s[i] != ']') return false; if (tmp == '{' && s[i] != '}') return false; } i++; } if (j == -1) return true; else return false; }
3. 优点:时间复杂度仅为O(n),执行速度很快。
4. 缺点:需要额外的10000字节空间用以存放字符
三、官方解法
与初次解答思想相同,都是使用栈。
四、C++写法
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
//遍历字符串每个字符,若为左类型则入栈,右类型则出栈
for (auto &i : s) {
if (i == '(' || i == '[' || i == '{') {
stk.push(i);
} else {
//遇到右类型,栈为空时则返回false
if (stk.empty())
return false;
//查看括号类型是否匹配
char ret = stk.top();
stk.pop();
if (i == ')' && ret != '(' ||
i == ']' && ret != '[' ||
i == '}' && ret != '{')
return false;
}
}
return stk.empty();
}
};
五、总结
当遇到一些符号匹配性判定时,可以考虑栈的数据结构。