zoukankan      html  css  js  c++  java
  • 括号匹配问题(Valid Parentheses)

    @(leetcode)[Valid Parentheses]

    题记:从今天开始每天一道leetcode上的题,每天一篇博客

    leetcode

    leetcode是国外的一个OJ网站,到目前为止总共有158到题,这些题目包含了数据结构的很多知识,做一做不仅能提高自己的编码能力,数据结构方面的知识也能学到不少。

    所有的这158道题在网上都能找到答案,把这些题刷完的人也不少。那我为什么还有每天刷一题,每天一篇博客呢?我的想法很简答,别人的答案是别人的知识,纸上得来终觉浅,绝知此事要躬行,自己做一遍之后才能知道自己有几斤几两。

    另外一个原因就是把刷过的题记在博客中,也算是一个笔记吧。

    PS:欢迎志同道合的小伙伴来一起刷题,一起学习,共同进步。

    我用的编程语言:Java

    Update:2014/11/26 博客园对Markdown的支持不好,如果每天在这里写博客,排版都要花掉不少时间。算了,我还是马克飞象+ Evernote吧,排版好看,还方便。每天一篇博客的话是不能兑现了,不过每天一道题没有问题!

    题目描述

    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.

    Total Accepted: 25934 Total Submissions: 92373

    class: Easy

    分析

    这道题让我们完成括号是否正确匹配的功能,这个功能在编译原理等课程中需要经常用到。

    要实现这个功能,说简单也简单,说难也难,关键是看你有没有用对数据结构。用什么结构好呢?对了,就是我们经常用到的栈结构。实际上,在现有的语法分析器中,这个功能都是用栈来实现的。

    伪代码

    输入:括号字符串,仅仅包含 (]} 这三种括号。
    输入:输入的括号字符串是不是合法的,合法的输出true,不合法输出false。

    1. 字符指针i = 0
    2. 根据字符指针取出括号字符串的当前字符,如果当前字符为空,跳到5
    3. 如果当前字符是左括号( (]}这三种 ),直接压入栈
    4. 如果当前字符是右括号( )]}这三种 ),从栈中弹出一个元素,弹出的元素如果和当前字符匹配,i++,回到2;否则,返回false
    5. 如果栈为空,返回true;否则返回false

    复杂度分析

    很容易看出来括号字符串的每个字符都只需要考虑一遍,时间复杂度是O(n)

    源代码

    import java.util.Stack;
    
    public class ValidParentheses {
        public boolean isValid(String s) {
        	//1代表( 2代表[ 3代表{ 4代表) 5代表] 6代表}
        	//第一种边界情况
        	if(s.length() == 0)
        		return true;
            Stack<Integer> stack = new Stack<Integer>();
            char c;
            int temp;
            for(int i = 0; i < s.length(); i++) {
            	c = s.charAt(i);
            	if(c == '(') stack.add(1);
            	else if(c == '[') stack.add(2);
            	else if(c == '{') stack.add(3);
            	else {
            		//第二种边界情况
            		if(stack.empty())
            			return false;
            		if(c == ')') temp = 4;
            		else if(c == ']') temp = 5;
            		else temp = 6;
            		if(stack.peek() != temp - 3)
            			return false;
            		else stack.pop();
            	}
            }
            if(stack.isEmpty()) return true;
            else return false;
        }
        
        public static void main(String[] args) {
        	ValidParentheses vp = new ValidParentheses();
        	String test = "][";
        	System.out.print(vp.isValid(test));
        }
    }
    

    别人是怎么做的

            if s == "":
                return True
            if len(s) % 2 == 1:
                return False
    
            else:
                while(  "()" in s or "[]" in s or "{}" in s):
                    s = s.replace("()", "")
                    s = s.replace("[]", "")
                    s = s.replace("{}", "")
                    return self.isValid(s)
                return False
    

    上面的代码用Python写的,虽然递归效率不高,但是很简洁,也很好懂

  • 相关阅读:
    分析存储过程重编译的起因以及避免
    存储过程重编译的优点、缺点、确定引发语句
    运用计划缓冲的建议
    查询计划Hash和查询Hash
    执行计划的重用
    执行计划组件、组件、老化
    执行计划的生成
    统计的基本操作语法 <第五篇>
    javascript 之 location.href、跨窗口调用函数
    git 删除远程分支和本地分支
  • 原文地址:https://www.cnblogs.com/moqiguzhu/p/moqiguzhu-leetcode-ValidParentheses.html
Copyright © 2011-2022 走看看