zoukankan      html  css  js  c++  java
  • 423 有效的括号序列

    原题网址:https://www.lintcode.com/problem/valid-parentheses/description

    描述

    给定一个字符串所表示的括号序列,包含以下字符: '(', ')''{''}''[' and ']', 判定是否是有效的括号序列。

    您在真实的面试中是否遇到过这个题?  

    样例

    括号必须依照 "()" 顺序表示, "()[]{}" 是有效的括号,但 "([)]"则是无效的括号。

    标签
     
    思路:利用栈先进后出、后进先出的特点进行匹配。 
    创建栈,遍历字符串。如果栈为空就把当前字符push到栈中;如果栈不为空就取出栈顶,判断当前字符是否是栈顶括号的另一半,如果是,弹出栈顶。
    全部遍历完成后,若栈为空,说明括号是匹配的(有效的),不为空说明括号是不匹配的(无效的)。
     
    注意:若字符串长度是奇数,括号一定是不匹配的。
     
    AC代码:
    class Solution {
    public:
        /**
         * @param s: A string
         * @return: whether the string is a valid parentheses
         */
        bool isValidParentheses(string &s) {
            // write your code here
         int n=s.size();
         if (n<=1||n%2==1)
         {
             return false;
         }
         stack<char> tmp;
         
         int j=0;
         while(j<n)
         {
             if (tmp.empty())
             {
                 tmp.push(s[j]);
             }
             else
             {
                 char temp=tmp.top();
                 if (rhalf(temp,s[j]))
                 {
                     tmp.pop();
                 }
                 else 
                 {
                     tmp.push(s[j]);
                 }
             } 
             j++;
         }
         if (tmp.empty())
         {
             return true;
         }
         return false;    
        
        }
        
        bool rhalf(char c1,char c2)
    {
        if (c1=='('&&c2==')')
        {
            return true;
        }
        if (c1=='['&&c2==']')
        {
            return true;
        }
        if (c1=='{'&&c2=='}')
        {
            return true;
        }
        return false;
    }
    };

     

    其他思路:
    首先我们需要知道,此题只是让我们判断括号序列是否合法,不是表达式是否合法,因此我们就假定只有括号,或者说我们只考虑括号,不考虑其他的字符。
    其次,我们知道括号是否有效:
    第一,括号要成对出现,例如出现左圆括号('(')n次,则右圆括号(')')也必须出现n次,对于方括号和花括号也是一样的;
    第二,括号可以嵌套,但是从里到外一定是满足可以成对抵消的,而不能够是错开的,这个从样例就可以看出来。

    那么我的思路就是借用栈这个数据结构来解此题。
    1. 遇到左括号,全部压入栈中;
    2. 遇到右括号,判断栈顶的元素是否是相对应的左括号,若是则弹出栈顶元素,若不是则返回false,若栈为空,也返回false; 转自此博客
     
     
    以上博客最后一句描述有错误,已经红字修改过来。
    代码可参考:
     
  • 相关阅读:
    [转]oracle数据库定时任务dbms_job的用法详解
    身份证号码的正则表达式及验证详解(JavaScript,Regex)
    js数组操作
    jq滚动到底部加载更多方法
    jq之实现轮播
    node之npm一直出错
    Jq之21点游戏
    移动端屏幕适配viewport
    meta属性
    用户体验之表单结构
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9224388.html
Copyright © 2011-2022 走看看