解题思路:1.长度为奇数的肯定不是有效;
2.最后一位是左括号肯定不是有效;
3.在没有出现左括号之前出现有括号肯定不是有效;
4.消右括号的顺序对不上左括号出现的顺序肯定不是有效。
class Solution {
public:
enum TYPE_
{
small = 0,
mid,
big
};
bool isValid(string s) {
int len = s.size();
if(len % 2 != 0) return false;
if( s[len - 1] == '(' ||
s[len - 1] == '[' ||
s[len - 1] == '{')
return false;
vector<int> cnt;
for(int i = 0; i < len; i++)
{
if(s[i] == '(' && i != len - 1)
{
cnt.push_back(small);
if(s[i + 1] == ']' || s[i + 1] == '}')
return false;
}
else if(s[i] == '[' && i != len - 1)
{
cnt.push_back(mid);
if(s[i + 1] == ')' || s[i + 1] == '}')
return false;
}
else if(s[i] == '{' && i != len - 1)
{
cnt.push_back(big);
if(s[i + 1] == ')' || s[i + 1] == ']')
return false;
}
else if(s[i] == ')')
{
if(cnt.size() == 0) return false;
int tmp = cnt.back();
if(tmp == small)
cnt.pop_back();
else
return false;
}
else if(s[i] == ']')
{
if(cnt.size() == 0) return false;
int tmp = cnt.back();
if(tmp == mid)
cnt.pop_back();
else
return false;
}
else if(s[i] == '}')
{
if(cnt.size() == 0) return false;
int tmp = cnt.back();
if(tmp == big)
cnt.pop_back();
else
return false;
}
}
if(cnt.size())
return false;
return true;
}
};