题一:有效的括号
题目地址:https://leetcode-cn.com/problems/valid-parentheses/,题号:20
【解题思路】
- 使用栈的方法:
- 对于左括号,首先肯定是合法的,只是后续需要判断是否有匹配闭合的有括号,先push到栈中;
- 右括号是不能独立存在的,如果一上来就是右括号,那肯定是不合法的;那么右括号首先要匹配到栈顶的第一个元素是否与它相匹配,如果匹配,那么就需要把栈顶元素给pop出去;如果不匹配直接返回false;
- 当走完整个流程之后,还需要判断栈必须为空的;
这个方法中,由于每个字符串都有且只能进入一次栈中,它的时间复杂度是O(n),空间复杂度也是O(n)。var isValid = function(s) {
var stack = [];
var map = new Map();
map.set("}", "{");
map.set("]", "[");
map.set(")", "(");
for(let value of s) {
if(value && !map.has(value)) { // 如果是左括号就入栈
stack.unshift(value);
} else if(stack.length === 0 && map.has(value)) { // 排除"["
return false;
} else if(stack.length > 0 && stack.shift() !== map.get(value)) { // 排除掉不匹配的情况
return false;
}
}
if(stack.length>0) return false; // 确保最后stack为空
return true;
};
另一个解法如下。
var isValid = function(s) {
var length;
do {
length = s.length;
s = s.replace("{}","").replace("[]","").replace("()","");
} while(length != s.length);
return s.length == 0;
};
在这个方法中,首先代码简洁性也是比较高的,然后思路是通过不断地抵消左右匹配括号,直到最后字符串为空。但是时间复杂度在平均情况下是达到了 O(1/2n),也就是O(n),所以还是推荐第一种方法。
to be continue…