• LeetCode20:有效的括号


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

    有效字符串需满足:

    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    注意空字符串可被认为是有效字符串。

    示例 1:

    输入: "()"
    输出: true
    示例 2:

    输入: "()[]{}"
    输出: true
    示例 3:

    输入: "(]"
    输出: false
    示例 4:

    输入: "([)]"
    输出: false
    示例 5:

    输入: "{[]}"
    输出: true

    这题其实有点不太符合常理,任何一种括号内部都可以嵌套任何一种括号。

    开始想到的是根据当前状态进行匹配,相当笨重且费时。

     1 class Solution {
     2 private:
     3     unordered_map<char,unordered_set<char>> allow={{'{',{'{','}','[','('}},
     4      {'[',{'[',']','(','{'}},{'(',{'(',')','{','['}}};
     5     unordered_map<char,char> cor={{'{','}'},{'[',']'},{'(',')'}};
     6 
     7 public:
     8     bool isValid(string s) {
     9         if(s.size()==0) return true;
    10         int n=s.size();
    11         vector<char> states;
    12         states.push_back('0');
    13         for(int i=0;i<n;i++){
    14             if(states.back()=='0'){
    15                 states.push_back(s[i]);
    16                 //cout<<"pushed"<<s[i]<<endl;
    17             }
    18             else{
    19                 //cout<<states.back()<<endl;
    20                 if(allow[states.back()].find(s[i])==allow[states.back()].end())
    21                     return false;
    22                 else if(cor[states.back()]==s[i])
    23                     states.pop_back();
    24                 else
    25                     states.push_back(s[i]);
    26                 
    27             }
    28         }
    29         if(states.back()!='0')
    30             return false;
    31 
    32         return true;
    33     }
    34 };

    本题其实考查的是栈的思想。遇到前括号,就直接压入栈中。遇到后括号,就看栈顶括号是否匹配。

    重新写了一版栈的代码,加入长度是否为奇数的判断可以大大提高速度。

     1 class Solution {
     2 public:
     3     bool isValid(string s) {
     4         stack<char> val;
     5         if(s.size()==0)
     6             return true;
     7         else if(s.size()%2==1)
     8             return false;
     9         for(int i=0;i<s.size();i++){
    10             if(s[i]=='{' || s[i]=='[' || s[i]=='(')
    11                 val.push(s[i]);
    12             else{
    13                 if(val.size()==0)
    14                     return false;
    15                 else if((s[i]==']' && val.top()!='[') || (s[i]=='}' && val.top()!='{') ||
    16                 (s[i]==')' && val.top()!='(') )
    17                     return false;
    18                 val.pop();
    19             }
    20         }
    21         if(val.size()!=0)
    22             return false;
    23         return true;
    24     }
    25 };
  • 相关阅读:
    Jenkins常用插件
    Jenkins安装配置简单使用
    Django简单快速实现PUT、DELETE方法
    Django admin有用的自定义功能
    ambari快速安装hadoop
    Asp.Net Core 3.0的依赖注入改变
    NCoreCoder.Aop 国庆更新
    NCoreCoder.Aop详解
    .Net Core 3.0下AOP试水~~
    .Net Core 3.0依赖注入替换 Autofac
  • 原文地址:https://www.cnblogs.com/rookiez/p/13196308.html
Copyright © 2020-2023  润新知