//map<char,char> m={{'(',')'},{'{','}'},{'[',']'}};
class Solution {
public:
bool isValid(string s) {
stack<char> st;
if(s.size()%2) //为奇数则一定不匹配
return false;
for(int i=0;i<s.size();i++)
{
if(s[i]=='('||s[i]=='{'||s[i]=='[')
st.push(s[i]);
else
{
if(st.empty())
return false;
char top=st.top();
st.pop();
if(top+1!=s[i]&&top+2!=s[i]) //方法二:'('与')'的ASCII值差1,'['与']','{'与'}'的ASCII值差2
//if(m[top]!=s[i])
return false;
}
}
return st.empty();
}
};
这个代码的意思就是把左括号输入到栈中,如果他是合乎提议的,第一个右括号会与栈顶的元素对齐,组成一个完整的括号。这个是在网上找的代码,自己之前没有用栈来作,76个样例通过了75,最后一个样例告诉我说是栈溢出。下面是错误的代码
下面是错误的代码
class Solution {
public:
bool isValid(string s) {
string Unmatched;
long a=0;
for(long i=0;i<s.length();i++){
if((s[i]=='(')||(s[i]=='{')||(s[i]=='[')){
a++;
Unmatched[a]=s[i];
}
else if((s[i]==(Unmatched[a]+1))||(s[i]==(Unmatched[a]+2)))
a--;
else return false;
}
if(a==0)
return true;
else
return false;
}
};
显示的错误是:AddressSanitizer: stack-buffer-overflow on address 0x7fff49ce42f0 at pc 0x000000405da0 bp 0x7fff49ce3e10 sp 0x7fff49ce3e08