利用栈的性质,先进后出,遇到左括号则压入栈,遇到右括号则与栈顶元素匹配,若匹配成功则将栈顶元素弹出,反之返回false。
如果字符串长度为奇数,直接返回错误。
解法一:栈
class Solution {
public:
bool isValid(string s) {
if(s.empty()) //字符串为空
return true;
stack<char> st; //初始化栈
for(int i=0;i<s.size();i++){
if(s[i]=='(' || s[i]=='[' || s[i]=='{') //左括号进栈
st.push(s[i]);
else if( !st.empty() && ((s[i]==')'&&st.top()=='(') //若栈不为空且与左括号匹配出栈
|| (s[i]=='}'&&st.top()=='{') || (s[i]==']'&&st.top()=='[')) )
st.pop();
else //否则错误
return false;
}
return st.empty(); //若最后栈中还有没有匹配的左括号也出错
}
};
方法二:栈,哈希表匹配
class Solution {
public:
bool isValid(string s) {
if(s.size()%2) //奇数个不可能匹配
return false;
map<char,char> mp{{')','('} ,{']','['},{'}','{'}} ; //利用哈希表辅助匹配
stack<char> st; //初始化栈
for(int i=0;i<s.size();i++){
if(s[i]=='(' || s[i]=='[' || s[i]=='{') //左括号进栈
st.push(s[i]);
else if(!st.empty() && mp[s[i]]==st.top()) //若栈不为空且与左括号匹配出栈
st.pop();
else //否则错误
return false;
}
return st.empty(); //若最后栈中还有没有匹配的左括号也出错
}
};
复杂度分析
时间复杂度:O(n),因为我们一次只遍历给定的字符串中的一个字符并在栈上进行 O(1)的推入和弹出操作。
空间复杂度:O(n),当我们将所有的开括号都推到栈上时以及在最糟糕的情况下,我们最终要把所有括号推到栈上。例如 ((((((((((。