一、题目及示例(C++实现)
1. 题目
给定一个只包括
‘(’,‘)’ ,‘{’,‘}’,‘[’,‘]’
的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
2. 示例
示例 1:
输入:s = “()” 输出:true
示例 2:
输入:s = “()[]{}” 输出:true
示例 3:
输入:s = “(]” 输出:false
示例 4:
输入:s = “([)]” 输出:false
示例 5:
输入:s = “{[]}” 输出:true
二、思路及图解
一般遇到括号匹配的问题,我们可以首先想到利用栈这个C++中的容器适配器,因为它具有后进先出的特点。
在这个题目中,我们先遍历字符串s的每一个字符,这里的字符全都是括号,我们要判断右括号和离它最近的左括号是否匹配。如果它是左括号 如:‘(’,‘{’,‘[’,那么我们将与之匹配的右括号压入栈中,当遍历遇到s中的右括号,如果此时栈为空,那么证明在遇到这个右括号之前我们没有遇到左括号,即s的第一个字符就是右括号,那么一定是错误的,返回false;或者会有这样一种情况,栈不为空,但是栈中的右括号与其最近的左括号不匹配,这种情况也返回false。否则,将栈顶元素出栈即可。
如果最后栈为空,则证明右括号全部找到了与之匹配的左括号,全都出栈成功,返回true;如果栈不为空则说明存在右括号与左括号不匹配的情况,返回false。
三、代码
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for(auto e : s)
{
if(e == '(')
{
st.push(')');
}
else if(e == '{')
{
st.push('}');
}
else if(e == '[')
{
st.push(']');
}
else if(st.empty() || e != st.top())
{
return false;
}
else
{
st.pop();
}
}
return st.empty();
}
};
|