本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41450987
通过本文你能学到如下知识:
(1)对数据结构中栈的理解,特别是Stack类中的peek()方法和pop()方法的区别。
(2)理解解题思路,提高思考问题的能力。
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.
题意:给定包含三种括号的字符串,判断该字符串中括号是否正确匹配。
解题思路:
(1)通过题意可知,括号是夹杂在字符之间的,而我们需要处理的是括号,所以,第一步是如何地将括号从字符串中分离出来。通过遍历字符串可将出现的括号存储起来。
(2)由于括号是成对进行匹配的,这里将成对出现的括号存储在HashMap中,以供后续查询比较。
(3)我们是通过一个栈来进行括号匹配的,我们将(1)中得到的括号往栈中存储以进行比较,第一个括号存储进去后,当第二个括号进入时需要进行判断。首先,判断其是否为
朝向左边的括号,这里用leftList.contains()进行判断,如果是不朝向左边的括号,将该括号压入栈中;如果不是朝向左边的括号,就需要从栈中取出元素和该括号进行比较,这里
用peep()方法获取当前的栈顶元素(不移除该元素)。其次,通过(2)中已获取的Map来得到与当前括号匹配的括号,如果得到的括号正好匹配,则从当前栈中移除已有元素,移
除栈顶元素的方法为pop();如果得到的括号不匹配,则匹配失败,返回false。最后,依次类推,直到所有的括号都进行匹配判断为为止。
PS:上面的解题思路肯定不是最好的,但其是本人自己思考的结果,虽然代码很罗嗦,但是思路还是比较清晰的,希望对你有所帮助,同时希望你给出建议,也希望能和大神进行一些交流。
解题代码如下(PS:本人技术比较菜,写的代码也很菜,但是OJ还是完全可以通过,大家有比较好的思路希望能够分享,谢谢):
public boolean isValid(String s) { int len = s.length(); boolean isvalid = true; Stack<Character> stack = new Stack<Character>(); Character[] all = {'[','(','{',']',')','}'}; Character[] left = {']',')','}'}; List<Character> leftlist = Arrays.asList(left); List<Character> alllist = Arrays.asList(all); Map<Character, Character> map = new HashMap<Character, Character>(); map.put('[', ']'); map.put('(', ')'); map.put('{', '}'); map.put('}', '{'); map.put(')', '('); map.put(']', '['); LinkedList<Character> linked = new LinkedList<Character>(); for (int i = 0; i < len; i++) { if(alllist.contains(s.charAt(i))){ linked.add(s.charAt(i)); } } if(linked.size()==0) return true; stack.push(linked.get(0)); for (int i = 1; i < linked.size(); i++) { Character str = linked.get(i); if(leftlist.contains(str) && stack.size() > 0){ if(map.get(str).equals(stack.peek())){ stack.pop(); }else{ isvalid = false; } }else{ stack.push(str); } } if(stack!=null && stack.size()>0){ isvalid = false; } return isvalid; }