hihoCoder--1110 正则表达式(区间dp)
来源:互联网 发布:软件项目管理模板 编辑:程序博客网 时间:2024/06/05 10:29
描述
给定一个字符串,判断其是否为合法的正则表达式。
一个正则表达式定义为:
1:0是正则表达式,1也是正则表达式。
2:P和Q都是正则表达式,则PQ是正则表达式。
3:P是正则表达式,则(P)是正则表达式
4:P是正则表达式,则P*也是正则表达式
5:P和Q都是正则表达式,则P|Q是正则表达式。
输入
输入包含多组数据。
每组数据为一行一个字符串,长度不超过100。
输出
对于每组数据,如果输入是合法的正则表达式,输出yes,否则输出no。
样例输入
010101101*
(11|0*)*
)*111
样例输出
yes
yes
no
题解
dp[i][j]表示s[i, j]是否为合法的正则表达式。
#include <bits/stdc++.h>using namespace std;const int maxn = 105;string s;int dp[maxn][maxn];int main(){#ifdef EXMYfreopen("data.in", "r", stdin);#endif // EXMY while(cin >> s){ memset(dp, 0, sizeof(dp)); int n = s.length(); for(int i = 0; i < n; ++i){ if(s[i] == '0' || s[i] == '1') dp[i][i] = true; // 规则1 } for(int L = 1; L < n; ++L){ for(int i = 0; i + L < n; ++i){ int j = i + L; if(s[i] == '(' && s[j] == ')' && dp[i + 1][j - 1]) dp[i][j] = true; // 规则3 if(s[j] == '*' && dp[i][j - 1]) dp[i][j] = true; // 规则4 for(int k = i; k < j; ++k){ if(dp[i][k] && dp[k + 1][j]) dp[i][j] = true; // 规则2 if(s[k + 1] == '|' && dp[i][k] && dp[k + 2][j]) dp[i][j] = true; // 规则5 } } } cout << (dp[0][n - 1] ? "yes" : "no") << endl; } return 0;}
0 0
- hihoCoder 1110 正则表达式 (区间dp)
- hihocoder 1110 正则表达式 (区间dp)
- hihoCoder--1110 正则表达式(区间dp)
- hihocoder #1110 : 正则表达 区间dp
- hihoCoder挑战赛7 1001 正则表达式 (区间DP)
- hihocoder #1110 正则表达式
- hihocoder 1110 正则表达式
- hihocoder 1110 正则表达式
- hihoCoder 1110 : 正则表达式
- hihoCoder之正则表达式
- hihocoder A Game 区间dp
- hihoCoder挑战赛7 正则表达式
- hihoCoder 1149 回文字符序列 (区间dp)
- hihocoder 1149 : 回文字符序列(区间dp)
- hihocoder 1636 : Pangu and Stones(区间dp)
- 区间DP 表达式
- 正则表达式汉字区间
- 正则表达式 方括号表达式 区间表达式
- 揭开Socket编程的面纱
- 欢迎使用CSDN-markdown编辑器
- spring中缓存配置
- Jetson TX1板载相机opencv调用打开
- 为什么要写博客
- hihoCoder--1110 正则表达式(区间dp)
- C++使用构造器初始化对象的两种方式
- 将Eclipse的项目转到Android Studio上
- 程序员如何解决问题,小策略大帮助
- Ubuntu升级后只能进入grub界面的解决方法
- java web项目监听session查看在线人数
- VC VS 2012 2015 调试在C# WinForm里调用的C++代码
- java中针对于时间转换的DateUtils工具类
- windows solr6 mmseg4j ik sqlserver数据库