题一:有效的括号
题目地址: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…
