解题思路
当开始接触题目时,我们会不禁想到如果计算出左括号的数量,和右括号的数量,如果每种括号左右数量相同,会不会就是有效的括号了呢?
事实上不是的,假如输入是 [{]},每种括号的左右数量分别相等,但不是有效的括号。这是因为结果还与括号的位置有关。
仔细分析我们发现,对于有效的括号,它的部分子表达式仍然是有效的括号,比如 {()[()]} 是一个有效的括号,()[{}] 是有效的括号,[()] 也是有效的括号。并且当我们每次删除一个最小的括号对时,我们会逐渐将括号删除完。比如下面的例子。
这个思考的过程其实就是栈的实现过程。因此我们考虑使用栈,当遇到匹配的最小括号对时,我们将这对括号从栈中删除(即出栈),如果最后栈为空,那么它是有效的括号,反之不是。
代码
Python
C++
class Solution:
def isValid(self, s: str) -> bool:
dic = {')':'(',']':'[','}':'{'}
stack = []
for i in s:
if stack and i in dic:
if stack[-1] == dic[i]: stack.pop()
else: return False
else: stack.append(i)
return not stack
代码中我们使用了哈希表来判断是否能够形成括号,从而决定进行入栈操作还是出栈操作。
复杂度分析
时间复杂度:O(N)。遍历了一遍字符串。
空间复杂度:O(N)。最坏情况下,假如输入是 (((((((,栈的大小将是输入字符串的长度。
作者:腐烂的橘子
链接:https://leetcode.cn/problems/valid-parentheses/solutions/89144/zhu-bu-fen-xi-tu-jie-zhan-zhan-shi-zui-biao-zhun-d/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
加上傻瓜式注释
class Solution {
public:
bool isValid(string s) {
/*
1. 首先设定哈希表,依次保存三个开括号`(分别对应1,2,3)`与三个闭括号`(分别对应4,5,6)`,以及栈`(只放入开括号,遇到对应闭括号,则出栈)`还有最后一个正确bool值,判断是否正确`(比如第一个就是闭括号,必然错误)`,且默认为真
2. for遍历string字符串
1. 如果为开括号,入栈
2. 否则栈非空时,且接下来的为对应闭括号,则出栈
3. 否则(此时隐含表达为'这是个闭括号'),则bool值为假
3. 如果栈非空时,则说明闭括号少了,bool为假
4. 返回bool值
*/
//哈希表,存储,以及栈
unordered_map<char,int> m{{'(',1},{'[',2},{'{',3},{')',4},{']',5},{'}',6}};
stack <char> st;
//用来判断如果第一个字符就是闭括号怎么办
bool isTrue =true;
//遍历string s
for(char c:s)
{
//如果为开括号,将其入栈
if(1<=m[c]&&m[c]<=3)st.push(c);
//以下两行都是错的,而且两行语法就错了,意味着不能正确出栈了
//else if(!st.empty() && m.find(m[c]-3)!=m.end() )st.pop();
//else if(!st.empty() && st.top()==m[c]-3)st.pop();
//如果栈非空,且栈顶元素与接下来的字符(闭括号)相对应,出栈
else if(!st.empty() && m[st.top()]==m[c]-3 )st.pop();
//否则俩个条件都不满足,意味着一开始就是个闭括号,或者闭括号多了,没有对应开括号在栈里面
else
{
isTrue=false;
break;//这里别忘了啊
}
}
//如果for遍历完后,栈非空,意味着开括号多了,则非法
if(!st.empty()) isTrue=false;
//返回bool值即可
return isTrue;
}
};
818

被折叠的 条评论
为什么被折叠?



