题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
思路
括号配对首先想到用栈,栈有先进后出的特点,我们可以遇到左边的括号:(,[,{就入栈,遇到右边的括号:),],}就检测栈顶是否可以与其配对,能够即可出栈,不能配对就能够直接判断不合法。最后做一次检测栈是否为空即可正确返回。
代码如下
class Solution {
public:
bool isValid(string s) {
if (s.length() % 2 != 0) {
return false;
}
stack<char> st;
for (int i = 0; i < s.length(); i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
st.push(s[i]);
} else if (s[i] == ')') {
if (st.empty()||st.top() != '(' ) {
return false;
}
st.pop();
} else if (s[i] == ']') {
if (st.empty()||st.top() != '[') {
return false;
}
st.pop();
} else if (s[i] == '}') {
if ( st.empty()|| st.top() != '{') {
return false;
}
st.pop();
}
}
if (st.empty()) {
return true;
}
return false;
}
};
刷题感受
这个题属于很简单的题,只要利用好数据结构就很容易做。但是如果不用栈来做也是可以的,可以用vector来模拟栈,总的来说stl真的很好用,