题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例:
输入: "()"
输出: true
输入: "()[]{}"
输出: true
输入: "{[]}"
输出: true
输入: "([)]"
输出: false
思路:
各种括号的ASCII码如下:
[]40 41
{}123 125
[]91 93
我们发现相匹配的括号ASCII码相差1或者2,可以根据这个规则来进行匹配。 "{[]}" 观察这个串我们发现,‘{’是最前面的,但是是最后与‘}’匹配的,我们一下就会想到栈——先进后出。把匹配成功的括号出栈,未匹配上的入栈,最后判断栈是否为空,为空则证明全匹配上了。返回true
C++中自带栈包,使用方法如下:
栈的定义:stack<typename> name;
入栈:name.push(i);
出栈:name.pop();//直接弹出栈顶,无需传入参数
获取栈顶元素:name.top();
判断栈是否为空:name.empty();//空位true
代码:
class Solution {
public:
bool isValid(string s) {
stack<char> mystack;
int len = s.length();
if(!len)
return true;
for(int i = 0;i < len;i++)
{
if(mystack.empty())//栈为空,直接入栈
{
mystack.push(s[i]);
continue;
}
if(mystack.top()+1==s[i]||mystack.top()+2 == s[i])//括号匹配上了,把左括号出栈
mystack.pop();
else
mystack.push(s[i]);//括号没匹配上就入栈
}
return mystack.empty();
}
};
注意:
1.要掌握栈包的使用方法
2.括号的ASCII码差1或2