20. 有效的括号
问题
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
分析
显然是栈。然而是否可以记录右括号的可用个数?当读到左括号时候右括号可用+1,代码如下:
class Solution {
public:
int l1 = 0, l2 = 0, l3 = 0;
int r1 = 0, r2 = 0, r3 = 0;
bool isValid(string s) {
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') {r1++;}
if (s[i] == '{') {r2++;}
if (s[i] == '[') {r3++;}
if (s[i] == ')') {if(r1 > 0) {r1--;} else return false;}
if (s[i] == '}') {if(r2 > 0) {r2--;} else return false;}
if (s[i] == ']') {if(r3 > 0) {r3--;} else return false;}
}
if (!r1 && !r2 & !r3) {return true;}
return false;
}
};
不行。因为对于"([)]"无法通过,忽略了要先匹配最近的一个左括号这个条件。
代码
class Solution {
public:
bool isValid(string s) {
stack<char> stk;
for (int i = 0; i < s.size(); i++) {
if (!stk.empty() &&
((stk.top() == '(' && s[i] == ')') ||
(stk.top() == '{' && s[i] == '}') ||
(stk.top() == '[' && s[i] == ']'))) {
stk.pop();
continue;
}
stk.push(s[i]);
}
if (stk.empty()) {
return true;
}
return false;
}
};

浙公网安备 33010602011771号