题目:给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
分析:由于栈先进后出的特性,非常适合处理对称匹配类的问题,尤其题目题目中还要求左括号必须以正确的顺序闭合。我们可以在每遇到一个左括号的时候就往栈里存放一个对应的右括号,当左括号遍历完,遍历到右括号时,如果遍历到的右括号和栈顶的元素不匹配说明左括号没有用相同类型的右括号闭合。如果还没有遍历完右括号,而栈已经空了,说明有多余的右括号。如果遍历完字符串,栈还没空,说明有左括号没有对应的右括号,如果此时栈空了,说明字符串有效。
具体代码:
class Solution {
public:bool isValid(string s) {stack<int> st;for(int i = 0; i < s.size(); i++) {if(s[i] =='(') {st.push(')');} else if(s[i] == '[') {st.push(']');} else if(s[i] == '{') {st.push('}');} else if(st.empty() || s[i] != st.top()) {return false;} else {st.pop();}}return st.empty();}
};