关闭

LeetCode20:Valid Parentheses

751人阅读 评论(0) 收藏 举报
分类:

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.

Hide Tags Stack String

这道题是检验输入的字符串是否符合规则,因为这是stack里的一道题目,所以一开始就是冲着如何用栈来求解这个问题。
最开始想的是将字符串中的元素全部插入栈中,然后再找出判断规则,很快就发现行不通,因为栈无法进行遍历操作,它只提供有限的几个进栈出栈的函数,然后顺着栈能进行的操作思考是不是在将字符串中的数据入栈的过程中就能进行判断呢?在纸上画了下草图发现真可以,每当遍历到一个元素时将它与栈顶元素进行判断,如果它和栈顶元素匹配,那么将栈顶元素弹出,否则将它入栈。比如说对于输入”([])”,一开始:(“进栈,然后由于”[“与”(“不匹配所以也进栈,然后遍历到”]”,由于”]”与栈顶元素”[“匹配所以”[“出栈,这样一直遍历下去。。。。
runtime:0ms

class Solution {
public:
    bool isValid(string s) {
        stack<char> datas;
        for(int i=0;i<s.size();i++)
        {
            if(datas.empty())
                datas.push(s[i]);
            else
            {
                if(com(datas.top(),s[i]))
                    datas.pop();
                else
                    datas.push(s[i]);
            }
        }
        return datas.empty();
    }

    bool com(char lhs,char rhs)
    {
        if(lhs=='('&&rhs==')')
            return true;
        if(lhs=='['&&rhs==']')
            return true;
        if(lhs=='{'&&rhs=='}')
            return true;
        return false;
    }
};

在Discuss中看到了另外一种实现,基本思路和我上面也是一样的,但是它的匹配不是像上面定义一个cmp函数,而是通过switch语句进行的,感觉也蛮不错的,所以也按照它的思路实现了一遍:

 bool isValid(string s) {
        stack<int> data;
        for(int c:s)
        {
            switch(c)
            {
                case '(':
                case '[':
                case '{':data.push(c); break;
                case ')':
                {
                    if(data.empty()||data.top()!='(')
                        return false;
                    else
                    {
                        data.pop();
                        break;
                    }
                }
                case ']':
                {
                    if(data.empty()||data.top()!='[')
                        return false;
                    else
                    {
                        data.pop();
                        break;
                    }
                }
                case '}':
                {
                    if(data.empty()||data.top()!='{')
                        return false;
                    else
                    {
                        data.pop();
                        break;
                    }
                }

            }
        }
        return data.empty();


    }
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:352548次
    • 积分:6336
    • 等级:
    • 排名:第4135名
    • 原创:261篇
    • 转载:43篇
    • 译文:13篇
    • 评论:46条
    友情链接
    博客专栏
    文章分类
    最新评论