Leetcode 题解 - 20. Valid Parentheses

题目

给定一个字符串,仅包含字符 (, ), {, }, [],判断输入的字符串是否有效。

括号的开闭必须有序,如 ()()[]{} 有序,但 (]([)] 无序。

难度:容易

编程语言: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。