力扣 20. 有效的括号

题目说明

  • 给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

    有效字符串需满足:

    1. 左括号必须用相同类型的右括号闭合。
    2. 左括号必须以正确的顺序闭合。
  • 提示:

    • 1 <= s.length <= 10^4
    • s 仅由括号 '()[]{}' 组成

示例

示例 1:

1
2
输入:s = "()"
输出:true

示例 2:

1
2
输入:s = "()[]{}"
输出:true

示例 3:

1
2
输入:s = "(]"
输出:false

示例 4:

1
2
输入:s = "([)]"
输出:false

示例 5:

1
2
输入:s = "{[]}"
输出: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
#include <stack>
/**
* 栈
* 字符串
*/
class Solution {
public:
bool isValid(string s) {
char ch[s.size() + 1];
// 将字符串数组中的字符复制出来
strcpy(ch, s.c_str());
// 声明栈
stack <char>sta;

for (int i = 0; i < s.size(); i++) {
char c = ch[i];
// 左括号就入栈
if (c == '(' || c == '[' || c == '{') {
sta.push(c);
}
// 右括号就进行甄别
else {
// 栈为空肯定是为不匹配
if (sta.empty()) {
return false;
}
char temp = sta.top();
// ASCII码 '(',')'相差为1 '[',']'以及'{','}'相差为2
if (c - temp < 0 || c - temp > 2) {
return false;
}
sta.pop();
}
}

// 栈为空说明全部匹配成功
return sta.empty();
}
};

时间空间效率都还行,可见此解法还比较适合此题;

image-20210823104830850

总结

本题是今天的一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。