题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
示例 2:
示例 3:
提示:
1 <= s.length <= 104
s
仅由括号 '()[]{}'
组成
初步解法
用栈保存括号左侧,遇到括号右侧比较一下,最后再比较栈是否为空即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <string> #include <stack> using namespace std; class Solution { public: bool isValid(string s) { if (s.size() % 2 != 0) { return false; } stack<char> strStack = stack<char>(); int i = 0; while (s[i] != '\0') { if (s[i] == '(' || s[i] == '{' || s[i] == '[') { strStack.push(s[i]); }else{ if (strStack.size() == 0) { return false; } if ((s[i] == ')' && strStack.top() == '(') || (s[i] == '}' && strStack.top() == '{') || (s[i] == ']' && strStack.top() == '[')) { strStack.pop(); }else{ return false; } } i++; } return strStack.size() == 0; } };
|
更有效率的写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <string> #include <stack> using namespace std; class Solution { public: bool isValid(string s) { stack<char> str = stack<char>(); for(auto c : s) { if (c == '(' or c == '{' or c == '[') { str.push(c); } else { if(str.empty() or (str.top() == '(' and c != ')') or (str.top() == '{' and c != '}') or (str.top() == '[' and c != ']')) { return false; } str.pop(); } } return str.empty(); } };
|
这样做的效率更高,初步推测是用了迭代器,所以就不用每次都判断是不是'\0'
,而且整体要判断的条件也少