@Aryami
题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
题解
- 第一个关键点是如何存储配对的括号,这里还是使用的unodered_map来实现。需要注意的是要把右括号设为key,左括号设为value。
- 第二个关键点是如何存储括号的顺序,使得左右括号匹配。可以使用stack存储左括号来实现。当读到右括号时,弹出栈顶数据,若匹配则继续循环;若不匹配或栈为空,则返回false。
- 第三个关键点是如果字符串的长度为奇数,说明必不匹配,可以直接返回false。
这样的时间复杂度是 O ( n ) O(n) O(n)。
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if(n%2!=0)
return false;
unordered_map<char, char> bracket =
{
{')', '('},
{'}', '{'},
{']', '['}
};
stack<char> left;
for(char c:s)
{
if(bracket.count(c))
{
if(left.empty() || left.top()!=bracket[c])
return false;
left.pop();
}
else
left.push(c);
}
return left.empty();
}
};
没有思考好括号的配对问题:)