题目
给定一个字符串,仅包含字符 (
, )
, {
, }
, [
和 ]
,判断输入的字符串是否有效。
括号的开闭必须有序,如 ()
和 ()[]{}
有序,但 (]
和 ([)]
无序。
难度:容易
编程语言:C++
分析
程序框架为:
1 2 3 4 5 6
| class Solution { public: bool isValid(string s) { } };
|
有效的括号 string 的结构是先入后出,所以思路是使用一个 stack,如果当前字符是 (
, [
或 {
,则入栈。如果当前字符是 )
, ]
或 }
,则检查栈顶元素是否匹配,如果匹配就出栈,继续遍历 s,不匹配则 return false。如果遍历完整个 s,栈里还有元素,则 return false,没有元素则 return true。
代码如下:
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 38 39 40 41 42 43 44 45
| #include <frequently-used-code-snippets.h> class Solution { public: bool isValid(string s) { stack<char> bracketStack; for (int i = 0; i < s.length(); i++) { char c = s[i]; if (c == '(' || c == '[' || c == '{') { bracketStack.push(c); continue; } if (c == ')' && ! bracketStack.empty() && bracketStack.top() == '(') { bracketStack.pop(); continue; } if (c == ']' && ! bracketStack.empty() && bracketStack.top() == '[') { bracketStack.pop(); continue; } if (c == '}' && ! bracketStack.empty() && bracketStack.top() == '{') { bracketStack.pop(); continue; } return false; } return bracketStack.empty(); } }; int main() { Solution sol; cout << sol.isValid("()") << endl; cout << sol.isValid("(]{)") << endl; cout << sol.isValid("()[]{}") << endl; cout << sol.isValid("([)]{}") << endl; cout << sol.isValid("[") << endl; cout << sol.isValid("]") << endl; }
|
提交到 Leetcode,Accepted! :) 运行时间为 0ms。