给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
自己算法思路:首先判断字符串是否为空,如果为空,直接认为是有效字符串,返回true;然后利用stack的数据结构来解题,逐个判断字符串,如果是左括号,就打入栈中,如果是右括号,判断栈是否为空,为空则返回false,再判断栈顶是不是对应的左括号,如果是,则将栈顶的元素出栈,如果不是,则返回false。
bool isValid(string s) { if(s.empty()) return true; stack<char> sta; for(int i=0;i<s.size();i++) { if(s[i]=='(' || s[i]=='[' || s[i]=='{') { sta.push(s[i]); } else if(sta.empty()) { return false; } else if((s[i] == ')' && sta.top()=='(') ||(s[i] == ']' && sta.top()=='[')||(s[i] == '}' && sta.top()=='{')) { sta.pop(); } else return false; } if(sta.empty()) return true; else return false; }
算法缺陷:因为每次只打入左括号,如果第一个就是右括号,则要先判断栈是否为空,否则访问栈顶元素则会出错。这样判断情况太多,不够简洁。
bool isValid(string s) { stack<char> result; int n=s.size(); if(n==0) return true; for(int i=0;i<n;i++) { if(result.empty()) result.push(s[i]); else if(result.top()=='('&&s[i]==')'|| result.top()=='['&&s[i]==']'|| result.top()=='{'&&s[i]=='}') result.pop(); else result.push(s[i]); } return result.empty(); }
只要栈中的元素为空,就入栈,而且栈顶和目前的元素无法配对的时候,同样打入栈中,这样避免了一开始就是右括号,不入栈,接下来要访问栈顶的尴尬,其余思路和上面的一样,最后只需要判断栈中是不是为空就好了。