1.题目
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
2.解题思路
本题解题思路在LeetCode中以及有很多写的很好的了。主要就是利用了栈,使用C++ std中的stack容器。将括号分为左括号:([{,右括号:)]},首先可以通过判断字符串是否为偶数,以及第一个字符是否是右括号,来进行快速false:
stack<char>s1;
if(s.length()%2 != 0)
return false;
else if(s[0] == ')' || s[0] == ']' || s[0] == '}')
return false;
然后进入循环,当遇到左括号就进栈,遇到右括号则判断是否和栈顶元素是配对的,配对方法可以用ASCII码关系,比如:ASCII('(') = ASCII(')')-1,[]{}为-2:
else
{
for(int i = 0; i < s.length(); i++)
{
if(s[i] == ')' || s[i] == ']' || s[i] == '}')
{
if(s1.top() == s[i] - 1 || s1.top() == s[i] - 2)
{
s1.pop();
}
else
{
return false;
}
}
else
{
s1.push(s[i]);
}
}
}
return s1.empty();
最后通过判断栈是否为空即可判断括号是否匹配了,匹配时为空