问题描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
思路
这一题可以用栈来做。
1.如果是左括号的话,压栈。
2.如果是右括号的话,判断栈顶是否与当前右括号相匹配。如果不配的话返回false,匹配的话将栈顶元素弹出。
3.最后判断栈顶是否为空,为空返回true,否者返回false;
由于只遍历一遍字符串所以时间复杂度为O(N)
AC代码
class Solution {
public:
bool isValid(string s) {
if (s.empty()) return true;
stack<char> stk;
for (auto c: s) {
if (c == '(' || c == '[' || c == '{') stk.push(c);
else if (c == ')'){
if (stk.empty() || stk.top() != '(')
return false;
stk.pop();
}
else if (c == ']') {
if (stk.empty() || stk.top() != '[')
return false;
stk.pop();
}
else {
if(stk.empty() || stk.top() != '{')
return false;
stk.pop();
}
}
return stk.empty();
}
};
优化版本
由于这几个括号的ascii的值相差不超过2,所以算一下它们的差值是否大于2就可以了
AC代码
class Solution {
public:
bool isValid(string s) {
if (s.empty()) return true;
stack<char> stk;
for (auto c: s) {
if (c == '(' || c == '[' || c == '{') stk.push(c);
else {
if (stk.size() && abs(stk.top() - c) <= 2) stk.pop();
else return false;
}
}
return stk.empty();
}
};