一、题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
二、题解
思路:使用stack特性,先进后出(FILO)。这里未使用官网给的方法,使用了两个stack空间复杂度上弱于官网。
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2 != 0)
return false;
stack<char> s1;
stack<char> s2;
for (char c : s)
{
s1.push(c);
}
while(not s1.empty())
{
if (s2.empty())
{
s2.push(s1.top());
s1.pop();
}
else
{
auto it = table.find(s1.top());
if (it != table.end())
{
if (it->second == s2.top())
{
s1.pop();
s2.pop();
}
else
{
s2.push(s1.top());
s1.pop();
}
}
else
{
s2.push(s1.top());
s1.pop();
}
}
}
return s2.empty();
}
private:
const map<char, char> table{
{'(', ')'},
{'[', ']'},
{'{', '}'},
};
};