题目
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例1:
输入:"()"
输出: true
示例2:
输入:"()[]{}"
输出: true
示例3:
输入:"(]"
输出: false
示例4:
输入:"([)]"
输出: false
示例5:
输入:"{[]}"
输出: true
思路
1.一个简单的例子:
如果只有一类符号的该类问题,即假设检测'()'是否是有效字符,则可以通过计数的方法去判断,当遇到'('时总数加1,遇到')'时总数减1。在遍历字符串的过程中,只要出现总数小于0的情况就是无效字符串,以及遍历完成后总数是否为0来判断字符串是否有效。但是此方法对于多种类型的符号,就不再适合。
2.使用栈数据结构:
使用栈数据结构,遍历字符串每个符号,遇见开括号,就将其推到栈上,当遇到闭括号,就检查栈顶的元素,如果栈顶是一个相同类型的左括号,我们就将其从栈中弹出。否则,即为无效的字符串。如果遍历完,栈中仍然有元素,这也意味着表达式无效。
解答
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2)
return false;
stack<char> sta;
char top;
for (auto x : s) {
//右括号,推入栈
if (x == '(' || x == '[' || x == '{') {
sta.push(x);
continue;
}
//遇见左括号,但是栈中没有元素
else if (sta.empty()) return false;
//如果当前元素与栈顶元素匹配,弹出
top = sta.top();
if ((x == ')' && top == '(') ||
(x == ']' && top == '[') ||
(x == '}' && top == '{'))
{
sta.pop();
}
else return false;
}
//最后,如果栈为空,则是有效括号
if (sta.empty())
return true;
else
return false;
}
};
【关注公众号DoCode,每日一道LeetCode,将零碎时间利用起来】