【栈】
20. 有效的括号
括号有三种类型,分别是小括号、中括号和大括号,每种括号的左右两半括号必须一一对应才是有效的括号,如果某一种括号之间穿插者其他的闭合的括号,那么这个括号字符串也是有效的,比如 "({[]})"
就是一个有效的括号字符串。
现在给你一个仅有括号组成的字符串,判断该字符串是否是有效的字符串。
本题使用栈来解决,我们可以边更新栈边在栈中找闭合的括号。
我们遍历字符串,如果栈为空,我们自然是要将当前的括号字符加入到栈中的,继续遍历字符串:
false
;true
;否则返回 false
。在判断当前遍历的字符是否是右括号时,可以使用哈希表。具体地,定义一个键为右括号字符,值为对应的左括号字符的哈希表 pairs
。在遍历字符串时,如果当前字符在哈希表的键中,可以使用 pairs.count()
或者 pairs.find()
来查找当前字符是否是右括号;如果当前字符是右括号,那么还可以使用哈希表来查找栈顶元素是否是左括号。
特别的,如果字符串的长度为奇数,那么该字符串一定不是有效的括号字符串。
实现代码
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1)
return false;
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> st;
for (auto ch : s) {
if (pairs.count(ch)) {
if (st.empty() || st.top() != pairs[ch])
return false;
st.pop();
}
else st.push(ch);
}
return st.empty();
}
};
复杂度分析
时间复杂度: O ( n ) O(n) O(n), n n n 为字符串 s
的长度。
空间复杂度: O ( n ) O(n) O(n)。
char pairs(char a) {
if (a == '}') return '{';
if (a == ']') return '[';
if (a == ')') return '(';
return 0;
}
bool isValid(char* s) {
int n = strlen(s);
if (n % 2 == 1) {
return false;
}
int stk[n + 1], top = 0;
for (int i = 0; i < n; i++) {
char ch = pairs(s[i]);
if (ch) {
if (top == 0 || stk[top - 1] != ch) {
return false;
}
top--;
} else {
stk[top++] = s[i];
}
}
return top == 0;
}
class Solution:
def isValid(self, s: str) -> bool:
if len(s) % 2 == 1:
return False
pairs = {
")": "(",
"]": "[",
"}": "{",
}
stack = list()
for ch in s:
if ch in pairs:
if not stack or stack[-1] != pairs[ch]:
return False
stack.pop()
else:
stack.append(ch)
return not stack
如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 。
如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。
最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 哦。