zoukankan      html  css  js  c++  java
  • LeetCode 20. Valid Parentheses

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

    An input string is valid if:

    1. Open brackets must be closed by the same type of brackets.
    2. Open brackets must be closed in the correct order.

    Note that an empty string is also considered valid.

    Example 1:

    Input: "()"
    Output: true
    

    Example 2:

    Input: "()[]{}"
    Output: true
    

    Example 3:

    Input: "(]"
    Output: false
    

    Example 4:

    Input: "([)]"
    Output: false
    

    Example 5:

    Input: "{[]}"
    Output: true
    

    这道题看似简单,但是我还是没有一次AC,思路很简答,就是入栈与出栈,遇到左括号入栈,遇见如果有匹配的括号将其出栈,否则返回false,到最后如果栈空则说明括号是合法且匹配的,类似的题目有Generate ParenthesesLongest Valid Parentheses

     1 class Solution {
     2 public:
     3     bool isValid(string s) {
     4         stack<char> sta;
     5         for (auto c : s)
     6         {
     7             if (c == '}')
     8             {
     9                 if (sta.empty() || sta.top() != '{')
    10                     return false;
    11                 else
    12                     sta.pop();
    13             }
    14             else if (c == ']')
    15             {
    16                 if (sta.empty() || sta.top() != '[')
    17                     return false;
    18                 else
    19                     sta.pop();
    20             }
    21             else if (c == ')')
    22             {
    23                 if (sta.empty() || sta.top() != '(')
    24                     return false;
    25                 else
    26                     sta.pop();
    27             }
    28             else
    29                 sta.push(c);
    30         }
    31         return sta.empty();
    32     }
    33 };

    有几个地方要注意:1、调用栈的top()函数时一定要先判决栈是否为空,否则会报错;2、多个else if 条件时,一定要用合适的方式进行分类讨论,否则容易重复或者遗漏

    以下是一种更简练的写法:

     1 class Solution {
     2 public:
     3     bool isValid(string s) {
     4         stack<char> parentheses;
     5         for (int i = 0; i < s.size(); ++i) {
     6             if (s[i] == '(' || s[i] == '[' || s[i] == '{') parentheses.push(s[i]);
     7             else {
     8                 if (parentheses.empty()) return false;
     9                 if (s[i] == ')' && parentheses.top() != '(') return false;
    10                 if (s[i] == ']' && parentheses.top() != '[') return false;
    11                 if (s[i] == '}' && parentheses.top() != '{') return false;
    12                 parentheses.pop();
    13             }
    14         }
    15         return parentheses.empty();
    16     }
    17 };

    类似的解答请参考:http://www.cnblogs.com/grandyang/p/4424587.html

  • 相关阅读:
    1. shiro-用户认证
    Salt 盐值
    使用ajax向后台发送请求跳转页面无效的原因
    @RequestParam和@RequestBody的区别
    JavaSE:Java11的新特性
    JavaSE: Java10的新特性
    JavaSE:Java9 新特性
    JavaSE:Java8新特性
    JavaSE:Java8新特性
    JavaSE:Java8 新特性
  • 原文地址:https://www.cnblogs.com/dapeng-bupt/p/9863292.html
Copyright © 2011-2022 走看看