LeetCode 20. 有效的括号
题面
LeetCode 20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串
s
s
s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
方法一. 栈
判断括号的有效性可以使用 「栈」 「栈」 「栈」这一数据结构来解决。
注意到有效字符串的长度一定为偶数,因此如果字符串的长度为奇数,我们可以直接返回 F a l s e False False,省去后续的遍历判断过程。
我们遍历给定的字符串 s s s 时。当我们遇到一个左括号时,我们希望在后续的遍历中,有一个相同类型的右括号将其闭合。因为后遇到的左括号要先闭合,因此我们将这个左括号放入栈顶。
当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈为空,那么字符串 s s s 不是有效字符串,返回 F a l s e False False。
在遍历结束后,如果栈为空,返回 T r u e True True,否则返回 F a l s e False False。
代码
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n & 1) {
return false;
}
stack<char> st;
unordered_map<char,char> mp;
mp[')'] = '(';
mp[']'] = '[';
mp['}'] = '{';
for (char& ch : s) {
if (mp.count(ch)) {// 是右括号
if (st.empty() || st.top() != mp[ch]) {// 如果栈为空或栈顶左括号不与当前右括号匹配
return false;
}
st.pop();
} else {// 否则就为左括号,加入栈中
st.push(ch);
}
}
return st.empty();
}
};
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n是字符串的长度
- 空间复杂度:
O
(
n
+
C
)
O(n + C)
O(n+C), 其中
C
C
C是字符集的大小,本题中为
6
6
6