423 有效的括号序列

Posted tang-tangt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; 转自此博客
 
 
以上博客最后一句描述有错误,已经红字修改过来。
代码可参考:
 







以上是关于423 有效的括号序列的主要内容,如果未能解决你的问题,请参考以下文章

括号序列/有效的括号

第78题给定一个括号序列,判断是否是一个有效的括号序列

数据结构与算法-有效括号序列

lintcode 有效的括号序列

leetcode-----32. 最长有效括号

如何在字符串中找到最大的有效括号和括号序列?