·解题思路·
字符串要达到特殊的“对称”,括号才是有效的,因此可以借助栈,不过要注意先把边界写好,例如空字符串和奇数个符号的情况就不用进入循环,直接返回结果。入栈时,需要先判断,如果碰到一对满足条件的括号,例如(){} ,就弹出;不满足就入栈,空栈也入栈,若最后栈为空,代表字符串是有效的。
代码如下:
class Solution{
public:
bool isValid(string s) {
int len = s.size();
if(!len) return true;
if(len%2==1) return false;
vector<char> st;
map<char,char> corresp;
corresp['}']='{';
corresp[']']='[';
corresp[')']='(';
for(int i=0;i<s.size();i++){
if(s[i]=='(' || s[i]=='[' || s[i]=='{') st.push_back(s[i]);
else{
if(st.size()<1||corresp[s[i]]!=st.back()) return false;
st.pop_back();
}
}
if(!st.empty()) return false;
return true;
}
}
参考大佬wallcwr的题解,使用vector实现栈的结构,直接用vector模拟栈比用stack更高效。
class Solution {
public:
bool isValid(string s) {
if(s.size() % 2) return false;
vector<char> st;
char cor;
for(auto i : s) {
if(i == '}' || i == ')' || i== ']') {
if (!st.empty())
cor = st[st.size()-1];
else return false;
if(i == '}' && cor != '{') return false;
if(i == ')' && cor != '(') return false;
if(i == ']' && cor != '[') return false;
st.pop_back();
}
else st.push_back(i);
}
return st.empty();
}
};
后来,我改了一下原来的代码,如下:
class Solution {
public:
bool isValid(string s) {
int len = s.size();
vector<char> st;
map<char,char> corresp;
corresp['}']='{';
corresp[']']='[';
corresp[')']='(';
if(!len) return true;
if(len%2==1) return false;
for(int i=0;i<s.size();i++){
if(s[i]=='(' || s[i]=='[' || s[i]=='{') st.push_back(s[i]);
else{
if(st.size()<1||corresp[s[i]]!=st.back()) return false;
st.pop_back();
}
}
if(!st.empty()) return false;
return true;
}
};