刚开始我以为就是单纯的去比较前后两个字符是否相同就可以了,于是写了如下代码。
class Solution {
public:
bool isValid(string s) {
for(int i=0;i<s.size();i++)
{
if( strcmp(s[i],s[i+1])==0)return true;
else
{
return false;
}
}
return true;
}
};
但是我忽略了万一测试用例中有除了'(',')','{','}','[',']'之外的字符,那么即便是前后两个字符值相同,那也通不过。
例如< >
所以我们应该把'(',')','{','}','[',']'这几个词写出来,和测试用例给的字符串做对比。
同时我们可以再把这几个字符串中左括号{ [ (提取出来进栈。
改完之后: 思路来源: 20. 有效的括号 - 力扣(LeetCode)
class Solution {
public:
bool isJUDE(char& left,char& right)
{
if(left=='{' && right=='}')return true;
else if(left=='[' && right==']')return true;
else if(left=='(' && right==')')return true;
else return false;
}
bool isValid(string s) {
int s_len = s.length();
//s的长度为奇数,一定是非法的
if (s_len % 2 != 0) {
return false;
}
stack <char> st;
//如果遇到{ ,[ ,( 就压入栈。
for(auto str:s)
{
if(str=='{'||str=='['||str=='(')st.push(str);
else if(!st.empty()&&isJUDE(st.top(),str))
//对比
st.pop();
else return false;
}
if(st.empty())
{
return true;
}
return false;
}
};