2017年蓝桥杯省赛A组c++第7题(正则问题)
/* 描述:正则问题 考虑一种简单的正则表达式: 只由 x ( ) | 组成的正则表达式。 小明想求出这个正则表达式能接受的最长字符串的长度。 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。 输入 ---- 一个由x()|组成的正则表达式。输入长度不超过100,保证合法。 输出 ---- 这个正则表达式能接受的最长字符串的长度。 例如, 输入: ((xx|xxx)x|(x|xx))xx 程序应该输出: 6 */ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; const int N=100; char str[N]="((xx|xxx)x|(x|xx))xx"; int i=0; int result=0; int f() { int max=0; int temp=0; while(i<strlen(str)) { if(str[i]=='(') { i++; temp+=f();//还不能确定temp+f()是不是最大,故而不能写 max+=f(); } else if(str[i]==')') { i++; break;//不能在这里直接写 return max;因为在返回之前一定还要比较max和temp的大小,从而返回两者中更大者;而且还要考虑循环的大条件 } else if(str[i]=='|') { i++; if(temp>max) max=temp;//总结这个|字符"之前的"最长x字符串的长度 temp=0; } else//字符为x的情况 { temp++; i++; } } if(temp>max) max=temp; return max; } int main() { //while(scanf("%s",str)!=0&&str!=NULL) { result=f(); cout<<result<<endl; } return 0; }
很难的一题,思考了很久,主要还是对于深度优先算法理解不够。这道题是误打误撞做出来的,并没有完全理解。不过看过某大佬画的一张图,感觉有助于理解:
tz@Teaching Building NO.4 HZAU
2018/3/17