题目:有效的括号
题目来源:https://leetcode.cn/leetbook/read/queue-stack/g9d0h/
题目内容:
- 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
- 有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
解题知识点:左右括号的ASCII码
右括号比左括号的ASCII码大1或者大2。
C++代码实现:方法一
左括号先压栈,遇到右括号时,取出栈顶元素,判断是否等于该右括号,不等于时直接返回false。
class Solution {
public:
bool isValid(string s) {
stack<char> charStack;
for (int i = 0; i < s.length(); i++)
{
char ch;
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
charStack.push(s[i]);
if (s[i] == ')' || s[i] == ']' || s[i] == '}')
{
if (charStack.empty())
return false;
else
{
ch = charStack.top();
if ((ch == '(' && s[i] == ')') ||
(ch == '[' && s[i] == ']') ||
(ch == '{' && s[i] == '}'))
{
charStack.pop();
}
else
return false;
}
}
}
return charStack.empty();
}
};
C++代码实现:方法二
判断字符串大小的奇偶,大小为奇数时,直接返回false。
class Solution {
public:
bool isValid(string s) {
if(s.size()&1) return false;
stack<char> ss;
for(int i=0; i<s.size(); i++)
{
if(ss.empty()) ss.push(s[i]);
else
{
if(ss.top()==s[i]-1 || ss.top()==s[i]-2) ss.pop();
else ss.push(s[i]);
}
}
if(ss.empty()) return true;
else return false;
}
};