码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode(7)-有效的括号

时间:2018-04-27 19:57:31      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:就是   否则   直接   出栈   自己   char   顺序   else   一个   

给定一个只包括 ‘(‘‘)‘‘{‘‘}‘‘[‘‘]‘ 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

自己算法思路:首先判断字符串是否为空,如果为空,直接认为是有效字符串,返回true;然后利用stack的数据结构来解题,逐个判断字符串,如果是左括号,就打入栈中,如果是右括号,判断栈是否为空,为空则返回false,再判断栈顶是不是对应的左括号,如果是,则将栈顶的元素出栈,如果不是,则返回false。

bool isValid(string s)
{
    if(s.empty()) return true;
    stack<char> sta;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]==( || s[i]==[ || s[i]=={)
        {
            sta.push(s[i]);
        }
        else if(sta.empty())
        {
            return false;
        }
        else if((s[i] == ) && sta.top()==() ||(s[i] == ] && sta.top()==[)||(s[i] == } && sta.top()=={))
        {
            sta.pop();
        }
        else
            return false;
    }
    if(sta.empty())
        return true;
    else
        return false;
}

算法缺陷:因为每次只打入左括号,如果第一个就是右括号,则要先判断栈是否为空,否则访问栈顶元素则会出错。这样判断情况太多,不够简洁。

bool isValid(string s) {
        stack<char> result;  
        int n=s.size();  
        if(n==0) return true;  
     for(int i=0;i<n;i++)  
            {  
                if(result.empty())  
                    result.push(s[i]);  
                else if(result.top()==(&&s[i]==)||  
                      result.top()==[&&s[i]==]||  
                      result.top()=={&&s[i]==})   
                        result.pop();  
                else  
                    result.push(s[i]);  
                  
            }  
            return result.empty(); 
    }

只要栈中的元素为空,就入栈,而且栈顶和目前的元素无法配对的时候,同样打入栈中,这样避免了一开始就是右括号,不入栈,接下来要访问栈顶的尴尬,其余思路和上面的一样,最后只需要判断栈中是不是为空就好了。

Leetcode(7)-有效的括号

标签:就是   否则   直接   出栈   自己   char   顺序   else   一个   

原文地址:https://www.cnblogs.com/mini-coconut/p/8963720.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!