虽然是一道简单题,但是我还是有想法的,就想写写题解,相信你们都会做,那就来看看有没有你没考虑到的方法吧:
方法一:直接模拟
这个代码是我自己写的,写完以后才发现有这么多问题(主要是逻辑上的错误,已订正):
class Solution {
public:
bool isValid(string s) {
int len=s.size();
if(len%2!=0)
return false;
stack <char> p;
for(int i=0;i<len;i++)
{
if(p.empty()&&(s[i]==')'||s[i]==']'||s[i]=='}'))
return false;
else if(s[i]==')'&&p.top()=='(')
p.pop();
else if(s[i]==']'&&p.top()=='[')
p.pop();
else if(s[i]=='}'&&p.top()=='{')
p.pop();
else
p.push(s[i]);
}
return p.empty();
}
};
方法二:利用map来对应(官方题解,值得学习)
class Solution {
public: bool isValid(string s)
{ int n = s.size(); if (n % 2 == 1)
{ return false; }
unordered_map<char, char> pairs =
{ {')', '('},
{']', '['},
{'}', '{'} };
stack<char> stk;
for (char ch: s)
{ if (pairs.count(ch))//如果找到了这个字符,那么就来判断栈顶的元素是否与之对应
{ if (stk.empty() || stk.top() != pairs[ch])
{ return false; }
stk.pop(); }
else { stk.push(ch); } }
return stk.empty(); }
};
方法三:ascll码的值(大佬神解,妙手回春)
class Solution {
public:
bool isValid(string s) {
if(s == ""){
return true;
}
vector<char> stack;
stack.push_back(s[0]);
for(int i=1; i<s.size(); i++){
if(stack.empty() == true){
stack.push_back(s[i]);
}else if(s[i] - stack.back() == 1 || s[i] - stack.back() == 2){//注意这个地方不能加绝对值,要不然就错了
stack.pop_back();
} else {
stack.push_back(s[i]);
}
}
return stack.empty();
}
};
记录当下,我的编程之路