时间限制:1000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个字符串,判断其是否为合法的正则表达式。
一个正则表达式定义为:
1:0是正则表达式,1也是正则表达式。
2:P和Q都是正则表达式,则PQ是正则表达式。
3:P是正则表达式,则(P)是正则表达式
4:P是正则表达式,则P*也是正则表达式
5:P和Q都是正则表达式,则P|Q是正则表达式。
输入
输入包含多组数据。
扫描二维码关注公众号,回复:
5944686 查看本文章
每组数据为一行一个字符串,长度不超过100。
输出
对于每组数据,如果输入是合法的正则表达式,输出yes,否则输出no。
样例输入
010101101* (11|0*)* )*111
样例输出
yes yes no
/*
区间DP dp[i][j]表示s[i, j]是否为合法的正则表达式。
*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <bitset>
#include <stack>
#define ll long long
#define ull unsigned long long
#define inf 0x3f3f3f3f
const int mod=1000000007;
const int N=110;
using namespace std;
char s[N];
int dp[N][N];
int main()
{
while(~scanf("%s",s))
{
memset(dp,0,sizeof(dp));
int len=strlen(s);
for(int i=0; i<len; i++)
if(s[i]=='0'||s[i]=='1')//定义一
dp[i][i]=1;
for(int l=2; l<=len; l++)
{
for(int i=0; i<len; i++)
{
int j=i+l-1;
if(j>=len)
break;
if(s[i]=='('&&s[j]==')'&&dp[i+1][j-1])//定义三
dp[i][j]=1;
if(s[j]=='*'&&dp[i][j-1])//定义四
dp[i][j]=1;
for(int k=i; k<j; k++)
{
if(dp[i][k]&&dp[k+1][j])//定义二
dp[i][j]=1;
if(s[k+1]=='|'&&dp[i][k]&&dp[k+2][j])//定义五
dp[i][j]=1;
}
}
}
if(dp[0][len-1])
printf("yes\n");
else
printf("no\n");
}
return 0;
}