题目来源
题目描述
class Solution {
public:
bool isValid(string s) {
}
};
题目解析
这道题让我们验证输入的字符串是否为括号字符串,包括大括号,中括号和小括号。
这里我们使用栈。
- 遍历输入字符串
- 如果当前字符为左半边括号时,则将其压入栈中
- 如果遇到右半边括号时,分类讨论:
- 1)如栈不为空且为对应的左半边括号,则取出栈顶元素,继续循环
- 2)若此时栈为空,则直接返回false
- 3)若不为对应的左半边括号,反之返回false
时间复杂度O(n),空间复杂度O(n)
使用栈:空间复杂度O(N)
#include <stack>
#include <string>
using namespace std;
//
bool isValid (string s){
if(s.empty()){
return true;
}
if(s.length() % 2 != 0){
return false;
}
stack<char> stack;
for (int i = 0; i < s.size(); ++i) {
if(s[i] == '(' || s[i] == '{' || s[i] == '['){
stack.push(s[i]);
}else{
if(stack.size() == 0){
return false;
}
char c = stack.top();
stack.pop();
char match;
if(s[i] == ')'){
match = '(';
}else if(s[i] == '}'){
match = '{';
}else {
match = ']';
}
if(c != match){
return false;
}
}
}
return stack.empty();
}
- 时间复杂度:O(n),因为我们一次只遍历给定的字符串中的一个字符并在栈上进行 O(1)O(1) 的推入和弹出操作。
- 空间复杂度:O(n),当我们将所有的开括号都推到栈上时以及在最糟糕的情况下,我们最终要把所有括号推到栈上。例如 ((((((((((