栈的解法应该是标准的解法,思路如下:
- 如果是左括号可以直接入栈
- 如果是右括号判断栈顶元素是否匹配,如果匹配就pop掉栈顶元素,如果不匹配就push新元素
- 判断栈是否为空,为空则匹配合法,反之不合法
我的解法:
class Solution {
public:
bool isValid(string s) {
stack<char> ST;
int len=s.length();
for(int i=0; i<len; i++){
char ch;
if(ST.empty())
ST.push(s[i]);
else{
ch=ST.top();
if(s[i]=='(' || s[i]=='[' || s[i]=='{')
ST.push(s[i]);
else if((s[i]==')' && ch!='(') || (s[i]==']' && ch!='[') || (s[i]=='}' && ch!='{'))
ST.push(s[i]);
else
ST.pop();
}
}
return ST.empty();
}
};
时间复杂度:O(n),n是字符串长度
空间复杂度:O(n),如果全为左符号就需要深度为n的额外栈空间
时间复杂度优化:当遇到右边的符号时,如果栈为空或者栈顶元素不匹配,就可以直接返回false
空间复杂度优化:当栈内元素数量大于len/2时,一定无法匹配完全,此时返回false就可以减少栈空间的使用
反思:本来耍小聪明想用ASII码差值来判断是否匹配,但是查表后发现“()”ASCII码差一,其他两对ASCII码相差二,还是老老实实写判断吧~