[栈]力扣 20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
题解#
利用栈先进后出的机制,遍历s
,当前元素s[i]
进行如下判断:
1.是否是([{
括号的左边,如果是,压栈;否则进入2.
2.不是括号左边那就是右边)]}
,判断当前右边符号能不能与栈顶的元素匹配为一个完整的括号,如果可以就出栈(因为栈顶括号已经被正确匹配了),下一次与右边元素匹配的就是之前还没有被正确匹配过的左边;如果不能正确匹配,进入3.
3.当前右边括号不能得到正确匹配,则s
是不合法的字符串,返回false
结尾判断栈是否为空,如果为空说明可能有s="("
这种情况,返回false
,否则返回true
代码
class Solution {
public:
bool isValid(string s) {
stack<char> st;
int len=s.size();
for(int i=0;i<len;i++){
//左边就进栈
if(s[i]=='('||s[i]=='['||s[i]=='{')
st.push(s[i]);
//不是左边就判断栈顶元素是否与当前右边元素匹配
else if(!st.empty()&&((s[i]==')'&&st.top()=='(')||s[i]==']'&&st.top()=='['||s[i]=='}'&&st.top()=='{'))
{
st.pop();
}
//不匹配就不是合法字符串
else{
return false;
}
}
//如果栈没空,即s="(",也是非法
if(!st.empty())
return false;
else
return true;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步