本文是在学习中的总结,欢迎转载但请注明出处: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;
    }

Leetcode_20_Valid Parentheses的更多相关文章

  1. [LeetCode] Remove Invalid Parentheses 移除非法括号

    Remove the minimum number of invalid parentheses in order to make the input string valid. Return all ...

  2. [LeetCode] Different Ways to Add Parentheses 添加括号的不同方式

    Given a string of numbers and operators, return all possible results from computing all the differen ...

  3. [LeetCode] Longest Valid Parentheses 最长有效括号

    Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...

  4. [LeetCode] Generate Parentheses 生成括号

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  5. [LeetCode] Valid Parentheses 验证括号

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...

  6. LeetCode 22. Generate Parentheses

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  7. 【leetcode】Generate Parentheses

    题目简述: Given n pairs of parentheses, write a function to generate all combinations of well-formed par ...

  8. No.022:Generate Parentheses

    问题: Given n pairs of parentheses, write a function to generate all combinations of well-formed paren ...

  9. 【LeetCode】241. Different Ways to Add Parentheses

    Different Ways to Add Parentheses Given a string of numbers and operators, return all possible resul ...

随机推荐

  1. 【转】使用virtualenv在ubuntu上搭建python 3开发环境

    ubuntu 13.04默认的python版本是2.7的,想在其上做python3的开发会遇到问题.比如要使用pip安装软件包时,默认安装的就是python2的包.如果想安装python3的包,就需要 ...

  2. LintCode题解之比较字符串

    使用标记的方式,先遍历一遍B,出现一次就记录一次出现次数,然后遍历A,将记录的B的出现次数消去,最后检查一下记录的标记位是不是都消去了,总共需要检查三次,即进行三次O(n)的遍历. 然后总结出规律如果 ...

  3. 【if...else】三角形判断

    给定三条边的长度,判断能否组成三角形,如果可以,判断三角形的形状. 输入要求 一组数据,每行三个实数,在(0,10]之间 输出要求 根据每行的数据判断,如果不能组成三角形,则输出"Not a ...

  4. JavaScript 注释

    JavaScript 注释可用于提高代码的可读性. JavaScript 注释 JavaScript 不会执行注释. 我们可以添加注释来对 JavaScript 进行解释,或者提高代码的可读性. 单行 ...

  5. Dapper连接与事务的简单封装

    增删改查方面,已经有Dapper.Extension这么强大的工具了,我也实在没啥好写的,就随手写了个看起来比较优雅的连接与事务的封装.在之后使用Dapper.Extension类库时,完全可以照搬进 ...

  6. Elasticsearch+Hbase实现海量数据秒回查询

    ---------------------------------------------------------------------------------------------[版权申明:本 ...

  7. 用Matlab画直方图

    简介 本文介绍如何使用matlab定制自己的直方图. 关键 使用Matlab的 bar() 函数创建柱状图 bar() 画的bin的高度跟数据相关 bar() 数据每一列一个group,有几列数据就画 ...

  8. sorted函数返回一个新的列表就安全了吗?

    arr=[[1,2,3],[4,2,3],[5,2,3]] x2=sorted(arr) print 'sorted',x2 print '-'*20 for ar in arr: ar.append ...

  9. 安卓高级6 CoordinatorLayout

    原作者大神地址:http://blog.csdn.net/huachao1001/article/details/51554608 曾在网上找了一些关于CoordinatorLayout的教程,大部分 ...

  10. Android简易实战教程--第四十话《Spinner》

    对于Spinner控件的介绍和使用方法,可以先看之前写过的一篇博客:Spinner控件详解 本篇就基于这个知识点完成一个简单的小案例: 根据介绍,先写一个布局: <?xml version=&q ...