前言
Leetbook学习记录,栈,检查括号对应关系是否正确。
题目地址: https://leetcode-cn.com/leetbook/read/queue-stack/g9d0h/
一、解题思路
思路其实大体上都一样,见到前括号,把对应的后括号压入栈,后面见到对应的后括号,弹出栈。
其实这个思路落实到代码上,还是有两个地方要注意:
1)如果给定的字符串中没有前括号怎么办?
2)判断栈为空的时候,有两个地方,在遍历字符串的过程中如果发现栈为空而字符串又不是前括号的情况,就说明括号对应关系有错;在遍历字符串过后发现栈为空的话,则说明括号对应关系正确。
二、作业记录
1.作业代码
代码如下:
class Solution {
public boolean isValid(String s) {
Stack<Character> br = new Stack<>();
int m = s.length();
for(int i = 0; i < m; i ++){
if(s.charAt(i) == '('){
br.push(')');
continue;
}
if(s.charAt(i) == '['){
br.push(']');
continue;
}
if(s.charAt(i) == '{'){
br.push('}');
continue;
}
if(!br.empty() && s.charAt(i) == br.peek())
br.pop();
else if(br.empty()) return false;
else return false;
}
if(br.empty())
return true;
else
return false;
}
}
2.作业表现
结果如下:
看了评论区,好像还是c++代码快一些,消耗内存少一些啊。
总结
这个算法的时间复杂度是O(m),m是字符串s的长度,而且其实O(m)是最差的情况,可能在中途就发现不对应,所以可以提前返回false。
这个算法的空间复杂度也是O(m), 这也是最差的情况,如果字符串全部是前括号,那么就把字符串全部压入栈。最好的情况就是字符串全部是后括号,那么就不需要占用额外的空间啦。