LeetCode( Valid Parentheses)有效的括号
2018-01-12 10:08
387 查看
Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.
The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not.法
乍一看这道题还是蛮熟悉的,确实本题也不难,但也是走了一些弯路。我之前做过一道类似的题,不过其中只有一种括号,解题思路:需要设一个整型变量,遍历一遍字符串,只要最后的结果不为零,便不有效(当然还有些特殊)。
于是,根据大脑信号,我的初始思路如下:设置了3个整型变量,每个变量对应一种括号,若为左括号,相对应的变量加一,若为右括号,相应的变量减一。根据最后的结果以及特殊情况进行最后的判断。(当然没有AC)代码:
写完后,感觉还挺简单的,潇洒的提交一下,73个案例通过了70个,我想是不是什么特殊情况没考虑到,失败的案例为“([)]”,我一看,不妙,我的思路不对。以我的思路,这种情况根本就没办法判断。失望之余不知从哪看到栈的身影,ok,思路来了:只要栈顶元素是左括号并且和当前元素是一对,那么就让出栈,不成对或者不是左括号则进栈。具体代码如下:
此处AC
后来在讨论区看到一个答案感觉很漂亮,他的思想:遍历字符数组,如果是左括号,就把相对应的右括号入栈,当遍历完左括号并开始遍历右括号了,把栈顶元素出栈,如果和数组当前元素相同,继续,否则结束。其代码如下:
这样,没有使用HashMap,也仅仅遍历一遍数组,空间消耗比我的少。
The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not.法
乍一看这道题还是蛮熟悉的,确实本题也不难,但也是走了一些弯路。我之前做过一道类似的题,不过其中只有一种括号,解题思路:需要设一个整型变量,遍历一遍字符串,只要最后的结果不为零,便不有效(当然还有些特殊)。
于是,根据大脑信号,我的初始思路如下:设置了3个整型变量,每个变量对应一种括号,若为左括号,相对应的变量加一,若为右括号,相应的变量减一。根据最后的结果以及特殊情况进行最后的判断。(当然没有AC)代码:
int len = s.length(); char[] array = s.toCharArray(); int littleb = 0; int midb = 0; int bigb = 0; for(int i=0;i<len;i++){ if(littleb < 0 || midb < 0 || bigb < 0){ return false; } switch(array[i]){ case '(': littleb++; break; case ')': littleb--; break; case '[': midb++; break; case ']': midb--; break; case '{': bigb++; break; case '}': bigb--; break; } } if(littleb ==0 && midb == 0 && bigb == 0){ return true; } return false;
写完后,感觉还挺简单的,潇洒的提交一下,73个案例通过了70个,我想是不是什么特殊情况没考虑到,失败的案例为“([)]”,我一看,不妙,我的思路不对。以我的思路,这种情况根本就没办法判断。失望之余不知从哪看到栈的身影,ok,思路来了:只要栈顶元素是左括号并且和当前元素是一对,那么就让出栈,不成对或者不是左括号则进栈。具体代码如下:
此处AC
public boolean isValid(String s) { char[] array = s.toCharArray(); //使用HashMap来匹配相对应的括号 HashMap<Character,Character> map = new HashMap(); map.put('(',')'); map.put('[',']'); map.put('{','}'); Stack<Character> stack = new Stack(); int i = 0; while(i < array.length){ if(!stack.empty()){ char top = stack.peek(); if(isLeft(top) && array[i] == map.get(top)){ stack.pop(); }else//不是右括号或者不匹配(开始我把这一步忘了) stack.push(array[i]); }else//栈空则入栈 stack.push(array[i]); i++; } if(stack.empty()) return true; return false; } public boolean isLeft(char c){ if('('== c || '{' == c || '[' == c) return true; return false; }
后来在讨论区看到一个答案感觉很漂亮,他的思想:遍历字符数组,如果是左括号,就把相对应的右括号入栈,当遍历完左括号并开始遍历右括号了,把栈顶元素出栈,如果和数组当前元素相同,继续,否则结束。其代码如下:
public boolean isValid(String s) { Stack<Character> stack = new Stack<Character>(); for (char c : s.toCharArray()) { if (c == '(') stack.push(')'); else if (c == '{') stack.push('}'); else if (c == '[') stack.push(']'); else if (stack.isEmpty() || stack.pop() != c) return false; } return stack.isEmpty(); }
这样,没有使用HashMap,也仅仅遍历一遍数组,空间消耗比我的少。
相关文章推荐
- leetCode 20.Valid Parentheses (有效的括号) 解题思路和方法
- 【LeetCode-面试算法经典-Java实现】【032-Longest Valid Parentheses(最长有效括号)】
- [LeetCode] 32. Longest Valid Parentheses 最长有效括号
- Leetcode刷题记——20. Valid Parentheses (有效的括号即括号匹配)
- LeetCode | 32. Longest Valid Parentheses——最长有效括号匹配长度
- [Leetcode] longest valid parentheses 最长的有效括号
- LeetCode: Longest Valid Parentheses (求最长有效匹配括号子串的长度)
- LeetCode-32.Longest Valid Parentheses最长有效括号子串
- leetcode 32. Longest Valid Parentheses 最长有效括号长度
- LeetCode | Longest Valid Parentheses(最长有效的括号匹配)
- leetcode32 Longest Valid Parentheses 最长有效括号序列
- leetcode20 Valid Parentheses 有效的括号
- [LeetCode]35. Valid Parentheses有效括号
- leetcode:Valid Parentheses(有效括号匹配)
- [Leetcode] valid parentheses 有效括号对
- LeetCode 20 Valid Parentheses(有效的括号)
- LeetCode-20-Valid Parentheses(有效的括号)
- 【LeetCode刷题】有效的括号字符串Valid Parentheses(java)
- [LeetCode] Longest Valid Parentheses 最长有效括号
- leetcode Valid Parentheses 有效括号