1.思路
区间DP,dp[i][j]代表区间i到j是否为正则表达式.
2.代码
1 #define debug printf("%s: %d ", __FUNCTION__, __LINE__); 2 #include <bits/stdc++.h> 3 using namespace std; 4 const int N = 105; 5 char s[N]; 6 bool dp[N][N]; 7 8 int main() { 9 while(~scanf("%s", s)) { 10 int n = strlen(s); 11 for(int i = 0; i < n; ++ i) { 12 if(s[i] == '0' || s[i] == '1') { 13 // 对于长度为1的区间,当为1或0时为正则表达式 14 dp[i][i] = 1; 15 } 16 else { 17 // 不为1或0时为非正则表达式 18 dp[i][i] = 0; 19 } 20 } 21 // 注意状态转移时运算符为或(|), 以为只要满足题目中的一种情况就可以 22 for(int l = 2; l <= n; ++ l) { 23 for(int i = 0; i+l-1 < n; ++ i) { 24 int j = i+l-1; 25 dp[i][j] = 0; 26 if(i<j-1&&s[i]=='('&&s[j]==')') { 27 dp[i][j] |= dp[i+1][j-1]; 28 // [i+1,j-1]是正则表达式,则([i+1,j-1])是正则表达式 29 } 30 if(s[j]=='*') { 31 // P是正则表达式,则P*也是正则表达式 32 dp[i][j] |= dp[i][j-1]; 33 } 34 for(int k = i; k < j; ++ k) { 35 // 当区间[i,k]和区间[k+1,j]为正则表达式时,区间[i,j]当然也是 36 dp[i][j] |= (dp[i][k]&dp[k+1][j]); 37 if(k>i&&s[k]=='|') { 38 //P和Q都是正则表达式,则P|Q是正则表达式。 39 dp[i][j] |= (dp[i][k-1]&dp[k+1][j]); 40 } 41 } 42 } 43 } 44 if(dp[0][n-1]) { 45 puts("yes"); 46 } 47 else { 48 puts("no"); 49 } 50 } 51 return 0; 52 }