一、题目描述
传送门:20. 有效的括号
描述:
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:s = “()” 输出:true
输入:s = “()[]{}” 输出:true
输入:s = “(]” 输出:false
二、思路
栈(stack):
首先注意到有效字符串的长度一定为偶数长度,因此如果字符串的长度为奇数,直接返回false
并且由于符号要匹配,s是一定是水平对称的。
为了简化操作,将输入的符号进行反向存储栈中:
当遇到一个左括号时,我们将一个相同类型的右括号压入栈中。
当遇到右括号时,只需要判断当前栈顶元素是否和该右括号相同。
最后,判断栈是否为空,如果是空,说明所有的括号匹配成功!
原文链接:https://blog.csdn.net/weixin_40162095/article/details/113786812
C++代码实现如下:
if(c == '(') st.push(')');
else if(c == '{') st.push('}');
else if(c == '[') st.push(']');
三、代码
完整cpp代码如下:
class Solution {
public:
bool isValid(string s) {
if(s.size() & 1) return false;
stack<char> st;
for(char c : s) {
if(c == '(') st.push(')');
else if(c == '{') st.push('}');
else if(c == '[') st.push(']');
else {
if(st.empty()) return false;
if(c == st.top()) st.pop();
else return false;
}
}
return st.empty();
}
};