题目:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
思路:
很简单的括号匹配问题,只需要用栈来实现就可以,当检测到反括号查询栈顶是否为对应的括号,是则出栈,字符串继续向后查找。不是则返回false,如果检测到括号则直接入栈。最后检测栈是否为空,若为空则返回true。
解题过程:
官方题解给的结构很不错,首先通过map创建一个表,反括号为key,括号为value,用count()函数查询键值是否在表中,若在表中则将栈顶元素与对应的value做比较,相同则出栈,不同则false。
首先判断字符串长度,若为奇数则肯定不匹配。
int length = s.size();
if(length % 2 == 1){
return false;
}
声明栈和map,这样方便后续维护与修改,当需要增添其他括号时可以直接修改map不用修改过多的代码。
stack<char> st;
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
循环体。
for(char c : s){
if(pairs.count(c)){
if(!st.empty() && st.top() == pairs[c]){
st.pop();
}else{
return false;
}
}else{
st.push(c);
}
}
return st.empty();
题解:
class Solution {
public:
bool isValid(string s) {
int length = s.size();
if(length % 2 == 1){
return false;
}
stack<char> st;
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
for(char c : s){
if(pairs.count(c)){
if(!st.empty() && st.top() == pairs[c]){
st.pop();
}else{
return false;
}
}else{
st.push(c);
}
}
return st.empty();
}
};