刷题来源:力扣(LeetCode)题意:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
大致思路:根据题意,从左至右,后遇到的左括号先匹配,所以,是不能想到用栈解决,把左括号入栈,每遇到一个右括号就与栈顶的符号匹配一哈,到最后,字符串遍历结束且栈为空,则可以返回true,思路很简单,但是其中还要考虑特殊情况,例如,字符串长度为奇数,则一定匹配不成功。
直接上代码:(用C++写的)
bool isValid(string s) {
if(s.size()==0)//空字符串为合格的情况
return true;
if(s.size()%2==1)
return false;
stack<char> sk;
for(int i=0;i<s.size();i++)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')
sk.push(s[i]);
else//为右括号
{
if(sk.empty()||(s[i]=='}'&&sk.top()!='{')||(s[i]==']'&&sk.top()!='[')|| (s[i]==')'&&sk.top()!='('))
return false;
sk.pop();
}
}
if(!sk.empty())
return false;
return true;
}