题目描述
题目分析
问题不难理解, 主要是明确成对条件:配对括号需“成对”出现才行,相互挨着,不能有间隔,即“(])”便是不被允许的。
解题方法1
使用栈来解决该问题,主要就是由两个操作来实现对成对括号的判断,依次遍历字符串,被遍历的元素是左括号的就入栈,不是左括号的进行判断,若与栈中的栈顶元素成对则弹出栈顶元素,不成对说明不是有效的括号。边界条件是需要在弹出时判断一下栈是否为空,若为空,则说明栈中无与之配对的括号,该字符串不是有效的括号。
class Solution {
public:
bool isValid(string s) {
if(s.size() % 2 == 1) return false;
stack<char> st;
for(int i = 0; i < s.size(); i++){
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
st.push(s[i]);
else{
if(s[i] == ')'){
if(st.empty()) return false;
if(st.top() == '(') st.pop();
else return false;
}
else if(s[i] == ']'){
if(st.empty()) return false;
if(st.top() == '[') st.pop();
else return false;
}
else if(s[i] == '}'){
if(st.empty()) return false;
if(st.top() == '{') st.pop();
else return false;
}
}
}
return st.empty();
}
};
时间复杂度为O(n),空间复杂度为O(n)。
构建Hash表解法
将成对括号存储在Hash表中,每次通过查询Hash表中的数据,来判断是否为成对括号。
参考文章:有效的括号
class Solution {
public:
bool isValid(string s) {
if(s.size() % 2 == 1) return false;
unordered_map<char,char> pairs = {
{')','('},
{']','['},
{'}','{'}
};
stack<char> st;
for(char ch : s){
if(pairs.count(ch)){
if(st.empty() || st.top() != pairs[ch]){
return false;
}
st.pop();
}else{
st.push(ch);
}
}
return st.empty();
}
};
时间复杂度为O(n),空间复杂度为O(n)。