题目
题目:给定一个只包括
'(',')','{','}','[',']'的字符串s,判断字符串是否有效。 有效字符串需要满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
思路分析
括号匹配是栈的经典应用场景。 栈的特点:后进先出。最后出现的左括号,要最先被对应的右括号抵消。
算法流程:
- 遍历字符串每一个字符
- 遇到左括号
( { [:直接压入栈中保存 - 遇到右括号
) } ]- 如果栈为空:没有左括号与之匹配,直接返回 false
- 判断栈顶的左括号和当前右括号是否配对,不匹配直接返回 false
- 匹配成功,弹出栈顶元素
- 循环结束,栈必须为空。如果栈里面还有残留左括号,说明括号没有闭合,返回 false。
cpp
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for(auto e:s)
{
if(e=='['||e=='{'||e=='(')
st.push(e);
else
{
if(st.empty())
return false;
if((st.top()!='('&&e==')')||
(st.top()!='['&&e==']')||
(st.top()!='{'&&e=='}'))
return false;
st.pop();
}
}
return st.empty();
}
};