给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if(n ==1 ) return false;
if(n ==0) return true;
if(n%2 != 0) return false;
unordered_map<string,string>hm;
vector<string> L;//保存左括号的栈
string a;
//建立左括号和右括号的哈希映射
hm["{"] = "}";
hm["("] = ")";
hm["["] = "]";
for(int i = 0 ; i < n ; i++ )
{
a = s[i];
if(a=="{"||a=="["||a=="(") L.push_back(a); //将左括号入栈
if(a=="}"||a=="]"||a==")") //当检测到右括号时,先判断栈是否为空,然后判断右括号和栈顶的左括号是否匹配,如果匹配则将栈顶pop。
{
if(L.empty()) return false;
else
{
string b = L[L.size()-1];
if(a == hm[b]) L.pop_back();
else return false;
}
}
}
if(L.size()!=0) return false;//如果遍历结束后栈不为空,则返回false
return true;
}
};
我的解法使用了栈和哈希表运行试件较慢,下面的方法运行速度较快
class Solution {
public:
bool isValid(string s) {
stack<char> left_bracket;
int len = s.size();
if(s.size()%2 > 0) return false;
for(int i = 0; i < len; ++i){
if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
left_bracket.push(s[i]);
}else if(s[i] == ')' || s[i] == ']' || s[i] == '}'){
if(s[i] == ')'){
if(left_bracket.empty() || left_bracket.top() != '(') return false;
}else if(s[i] == ']'){
if(left_bracket.empty() || left_bracket.top() != '[') return false;
}else{
if(left_bracket.empty() || left_bracket.top() != '{') return false;
}
left_bracket.pop();
}else{
return false;
}
}
return left_bracket.empty();
}
};