HihoCoder - 1110
题意:
您的任务是判断输入是否是合法的正则表达式。正则表达式定义如下:
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]==‘|‘。这四项种情况只要发生一个这个串就不行
代码:
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #include<vector> #include<queue> #include<stack> #include<map> using namespace std; typedef long long ll; const int maxn=105; const int INF=0x3f3f3f3f; const double eps=1e-10; stack<int>r; int main() { char s[maxn]; while(~scanf("%s",s)) { while(!r.empty()) r.pop(); int len=strlen(s); int flag=0; if(s[0]==‘*‘ || s[0]==‘|‘ || s[len-1]==‘|‘) { printf("no\n"); continue; } for(int i=0; i<len; ++i) { if((s[i]==‘*‘ && s[i-1]==‘(‘) || (s[i]==‘*‘ && s[i-1]==‘|‘)) { flag=1; break; } if((s[i]==‘|‘ && s[i-1]==‘(‘) || (s[i]==‘|‘ && s[i+1]==‘)‘)) { flag=1; break; } if(s[i]==‘(‘) r.push(i); else if(s[i]==‘)‘) { if(r.size()) { if(i-r.top()==1) { flag=1; break; } else r.pop(); } else { flag=1; break; } } } if(flag) { printf("no\n"); } else { printf("yes\n"); } } return 0; }
相关推荐
wangzhaotongalex 2020-10-20
wyq 2020-11-11
TLROJE 2020-10-26
风雨断肠人 2020-10-13
duanqingfeng 2020-09-29
rechanel 2020-11-16
cshanzhizi 2020-10-16
luofuIT成长记录 2020-09-22
phphub 2020-09-10
taomengxing 2020-09-07
MaggieRose 2020-08-19
flyingssky 2020-08-18
山水沐光 2020-08-18
jyj00 2020-08-15
AHuqihua 2020-08-09
山水沐光 2020-08-03