题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例
示例 1:
输入: "()[]{}"
输出: true
示例 2:
输入: "(]"
输出: false
示例 3:
输入: "([)]"
输出: false
思路
括号必须满座左开右闭。利用这个特性,可以用一个栈来实现,遇到左括号就Push,若遇到右括号,则比较当前栈顶左括号是否匹配,若匹配则直接将栈顶Pop,若不匹配直接Return即可。
为了查找方便,建立一个哈希表。
则时间复杂度O(n),空间复杂度O(n)。
代码
class Solution {
public:
unordered_map<char, int> map;
void initMap() {
map['('] = 0;
map['['] = 1;
map['{'] = 2;
map[')'] = 5;
map[']'] = 4;
map['}'] = 3;
}
bool isValid(string s) {
int n = s.size();
if (n == 0) return true;
initMap();
stack<char> stack;
for (int i = 0; i < n; ++i){
if (map[s[i]] >= 3){
if (stack.empty()) return false;
else if (map[stack.top()] + map[s[i]] == 5) stack.pop();
else return false;
}
else stack.push(s[i]);
}
return stack.empty();
}
};