给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
这题其实有点不太符合常理,任何一种括号内部都可以嵌套任何一种括号。
开始想到的是根据当前状态进行匹配,相当笨重且费时。
1 class Solution { 2 private: 3 unordered_map<char,unordered_set<char>> allow={{'{',{'{','}','[','('}}, 4 {'[',{'[',']','(','{'}},{'(',{'(',')','{','['}}}; 5 unordered_map<char,char> cor={{'{','}'},{'[',']'},{'(',')'}}; 6 7 public: 8 bool isValid(string s) { 9 if(s.size()==0) return true; 10 int n=s.size(); 11 vector<char> states; 12 states.push_back('0'); 13 for(int i=0;i<n;i++){ 14 if(states.back()=='0'){ 15 states.push_back(s[i]); 16 //cout<<"pushed"<<s[i]<<endl; 17 } 18 else{ 19 //cout<<states.back()<<endl; 20 if(allow[states.back()].find(s[i])==allow[states.back()].end()) 21 return false; 22 else if(cor[states.back()]==s[i]) 23 states.pop_back(); 24 else 25 states.push_back(s[i]); 26 27 } 28 } 29 if(states.back()!='0') 30 return false; 31 32 return true; 33 } 34 };
本题其实考查的是栈的思想。遇到前括号,就直接压入栈中。遇到后括号,就看栈顶括号是否匹配。
重新写了一版栈的代码,加入长度是否为奇数的判断可以大大提高速度。
1 class Solution { 2 public: 3 bool isValid(string s) { 4 stack<char> val; 5 if(s.size()==0) 6 return true; 7 else if(s.size()%2==1) 8 return false; 9 for(int i=0;i<s.size();i++){ 10 if(s[i]=='{' || s[i]=='[' || s[i]=='(') 11 val.push(s[i]); 12 else{ 13 if(val.size()==0) 14 return false; 15 else if((s[i]==']' && val.top()!='[') || (s[i]=='}' && val.top()!='{') || 16 (s[i]==')' && val.top()!='(') ) 17 return false; 18 val.pop(); 19 } 20 } 21 if(val.size()!=0) 22 return false; 23 return true; 24 } 25 };