hihocoder #1110 : 正则表达式(区间DP)

时间限制: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;
}

猜你喜欢

转载自blog.csdn.net/Kuguotao/article/details/89352804