Leetcode笔记整理—easy篇—Valid Parentheses

**

Valid Parentheses

**

问题简介:

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.

运行效果图:

这里写图片描述

实现方法:

#include <stack>

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        bool ret = true;
        int tmp = 0;
        char temp = 0;
        for(int i = 0; i < s.length(); i++)
        {
            if(isLeft(s[i]) != 0)
            {
                tmp = isLeft(s[i]);
                if(tmp == 1 || tmp == 2 || tmp == 3){
                    st.push(s[i]);
                }
                if(tmp == -1)
                {
                    if(st.empty() == 1)
                    {
                        ret = false;
                        goto End;
                    }
                    temp = st.top();
                    st.pop();
                    if(isRight(s[i]) != isLeft(temp))
                    {
                        ret = false;
                        goto End;
                    }
                }
            }
        }
        if(st.empty() != 1)
            ret = false;
        End:
            return ret;
    }
    int isRight(char a)
    {
        int ret = 0;
        if(a == '}'){
            ret = 3;
            goto End;
        }
        if(a == ']'){
            ret = 2;
            goto End;
        }
        if(a == ')'){
            ret = 1;
            goto End;
        }
    End :
        return ret;
    }
    int isLeft(char a)
    {
        int ret = 0;
        if(a == '{'){
            ret = 3;
            goto End;
        }
        if(a == '['){
            ret = 2;
            goto End;
        }
        if(a == '('){
            ret = 1;
            goto End;
        }
        if(a == '}'||a == ']'||a == ')')
        {
            ret = -1;
            goto End;
        }
    End :
        return ret;
    }
};

经典分析:

#include <stack>

class Solution {
public:
    bool isValid(string s) {
        stack<char> paren;
        for (char& c : s) {
            switch (c) {
                case '(': 
                case '{': 
                case '[': paren.push(c); break;
                case ')': 
                    if (paren.empty() ||paren.top()!='(') 
                    return false; 
                    else 
                    paren.pop(); break;
                case '}': 
                    if (paren.empty() ||paren.top()!='{') 
                    return false; 
                    else paren.pop(); break;
                case ']': 
                    if (paren.empty() || paren.top()!='[') 
                    return false; 
                    else paren.pop(); break;
                default: ; // pass
            }
        }
        return paren.empty() ;
    }
};

感谢Leetcode用户: chammika


几个技巧性的用法:

- 1、for (char& c : s):

强类型遍历s字符串:
相当于C++的:

for( int i = 0; i < s.length(); i++)
    { s[i]....
    }

2、在switch中对问题的抽象过程

case ')': 
   if (paren.empty() ||paren.top()!='(') 
   return false; 
   else 
   paren.pop(); break;
 case '}': 
   if (paren.empty() ||paren.top()!='{') 
   return false; 
   else paren.pop(); break;
 case ']': 
   if (paren.empty() || paren.top()!='[') 
   return false; 
   else paren.pop(); break;

总结:

本题考查的是栈的用法,同时就是算法的灵活性,如何精简代码是本题提升性能的一个要点。

猜你喜欢

转载自blog.csdn.net/fair_angle/article/details/70792570
今日推荐