Leetcode 有效的括号
-
给定一个只包括
'(',')','{','}','[',']'的字符串,判断字符串是否有效。
有效字符串需满足:a. 左括号必须用相同类型的右括号闭合 b.左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例一
输入: "()" 输出: true
示例二
输入: "()[]{}" 输出: true
示例三
输入: "(]" 输出: false
示例四
输入: "([)]" 输出: false
示例五
输入: "{[]}" 输出: true
解法
栈和哈希表的结合
将右括号和左括号,以键值(key-value)的形式存储在哈希表中。然后遍历字符串,如果当前字符不在哈希表中(即它是一个左括号),那么就将它入栈,等待相匹配的右括号;如果在哈希表中,那么就取栈顶元素,看它是否和当前字符先匹配,如果不匹配,直接返回false。如果最终的栈中有剩余元素,返回false,否则返回true。
class Solution {
public:
bool isValid(string s) {
if(s == "") return true;
int len = s.length();
if(len % 2) return false; // 奇数个括号,直接返回false
stack<char> s1;
unordered_map<char, char> mapping;
mapping[')'] = '(';
mapping[']'] = '[';
mapping['}'] = '{';
for(int i=0; i<len; i++){
// 哈希表里面有当前的括号
if(mapping.find(s[i]) != mapping.end()){
char top_element = (!s1.empty()) ? s1.top(): '#';
if(top_element != mapping[s[i]]) return false;
else s1.pop();
}
else s1.push(s[i]);
}
if(s1.empty()) return true;
else return false;
}
};

浙公网安备 33010602011771号