hihoCoder--1110 正则表达式(区间dp)
2017-01-14 14:47
387 查看
描述
给定一个字符串,判断其是否为合法的正则表达式。
一个正则表达式定义为:
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
给定一个字符串,判断其是否为合法的正则表达式。
一个正则表达式定义为:
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 EXMY freopen("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; }
相关文章推荐
- hihoCoder 1110 正则表达式 (区间dp)
- hihocoder 1110 正则表达式 (区间dp)
- hihoCoder挑战赛7 1001 正则表达式 (区间DP)
- hihocoder 1110 正则表达式
- hihoCoder 1110 : 正则表达式
- hihocoder #1110 : 正则表达 区间dp
- hihocoder 1110 正则表达式
- hdu 6170 正则表达式 dp
- 区间DP 表达式
- 【HIHOCODER 1320】压缩字符串(区间DP)
- hdu 6170 正则表达式 dp
- 【LeetCode61-70】旋转链表,三道标准DP问题,正则表达式,word文字排版规则,
- hihocoder 1636 : Pangu and Stones(区间dp)
- 2017多校联合第9场1010 Two String/hdu 6170(正则表达式/dp)
- hihoCoder 1149 回文字符序列 (区间dp)
- HihoCoder - 1636 Pangu and Stones——区间dp
- 【Hihocoder1636】Pangu and Stones(区间DP)
- hdu 6170 正则表达式 dp
- hdu 6170 正则表达式 dp
- hihocoder A Game 区间dp