1

题目:

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = “()”
输出:true

示例 2:

输入:s = “()[]{}”
输出:true

示例 3:

输入:s = “(]”
输出:false

提示:

1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成

解题思路:

将每个左括号与右括号进行匹配,若出现多余的括号或者右括号与前面的左括号类型不一样就返回 false

那么我们就可以用到 后进先出 的数据结构

代码:

Python:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution:
def isValid(self, s: str) -> bool:
stack = []
l, r = {'(', '[', '{'}, {')', ']', '}'}
for c in s:
if c in l:
stack.append(c)
elif c in r:
# 栈不为空且与右括号类型一样
if c == ')' and stack and stack[-1] == '(':
stack.pop()
elif c == ']' and stack and stack[-1] == '[':
stack.pop()
elif c == '}' and stack and stack[-1] == '{':
stack.pop()
else:
return False
return len(stack) == 0

C++:

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
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) return false;

unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};

stack<char> stk;
for (char ch : s){
if (pairs.count(ch)){
if (stk.empty() || stk.top() != pairs[ch]){
return false;
}
stk.pop();
}
else{
stk.push(ch);
}
}
return stk.empty();
}
};