zoukankan      html  css  js  c++  java
  • HihoCoder

    题意:

    您的任务是判断输入是否是合法的正则表达式。正则表达式定义如下:

    1: 0和1都是正则表达式。

    2:如果P和Q是正则表达式,那么PQ就是正则表达式。

    3:如果P是正则表达式,(P)就是正则表达式。

    4:如果P是正则表达式,则P*是正则表达式。

    5:如果P和Q是正则表达式,则P|Q是正则表达式。

    题解:

    如果只有01,那么这个串肯定符合要求。所以不符合要求主要是违背了3,4,5号规则。下面分别说一下

    1、对于3号规则,我们可以用栈去判断左右括号是否配对(我记得专门有这样一道题)。如果配对的话还要注意一下左右括号之间不能为空

    2、对于4号规则,我们发现我们不用去管‘*’号右边的,只要‘*’号左边的满足规则就行。if((s[i]=='*' && s[i-1]=='(') || (s[i]=='*' && s[i-1]=='|')) 或者s[0]=='*',这三项种情况只要发生一个这个串就不行

    3、对于5号规则if((s[i]=='|' && s[i-1]=='(') || (s[i]=='|' && s[i+1]==')')),s[0]=='|' , s[len-1]=='|'。这四项种情况只要发生一个这个串就不行

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<math.h>
     6 #include<vector>
     7 #include<queue>
     8 #include<stack>
     9 #include<map>
    10 using namespace std;
    11 typedef long long ll;
    12 const int maxn=105;
    13 const int INF=0x3f3f3f3f;
    14 const double eps=1e-10;
    15 stack<int>r;
    16 int main()
    17 {
    18     char s[maxn];
    19     while(~scanf("%s",s))
    20     {
    21         while(!r.empty())
    22             r.pop();
    23         int len=strlen(s);
    24         int flag=0;
    25         if(s[0]=='*' || s[0]=='|' || s[len-1]=='|')
    26         {
    27             printf("no
    ");
    28             continue;
    29         }
    30         for(int i=0; i<len; ++i)
    31         {
    32             if((s[i]=='*' && s[i-1]=='(') || (s[i]=='*' && s[i-1]=='|'))
    33             {
    34                 flag=1;
    35                 break;
    36             }
    37             if((s[i]=='|' && s[i-1]=='(') || (s[i]=='|' && s[i+1]==')'))
    38             {
    39                 flag=1;
    40                 break;
    41             }
    42             if(s[i]=='(')
    43                 r.push(i);
    44             else if(s[i]==')')
    45             {
    46                 if(r.size())
    47                 {
    48                     if(i-r.top()==1)
    49                     {
    50                         flag=1;
    51                         break;
    52                     }
    53                     else r.pop();
    54                 }
    55                 else
    56                 {
    57                     flag=1;
    58                     break;
    59                 }
    60             }
    61         }
    62         if(flag)
    63         {
    64             printf("no
    ");
    65         }
    66         else
    67         {
    68             printf("yes
    ");
    69         }
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    Windows7 共享文件夹的两个BUG
    POJ 1845 Sumdiv(数论,求A^B的所有约数和)
    POJ 2481 Cows(树状数组)
    HDU 1124 Factorial(简单数论)
    POJ 1195 Mobile phones(二维树状数组)
    POJ 3067 Japan(树状数组求逆序对)
    HDU 4027 Can you answer these queries?(线段树)
    HDU 1576 A/B(数论简单题,求逆元)
    HDU 1166 敌兵布阵(线段树,树状数组)
    ZOJ 1610 Count the Colors(线段树)
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/12759646.html
Copyright © 2011-2022 走看看