考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
一个由x()|组成的正则表达式。
输出格式
输出所给正则表达式能接受的最长字符串的长度。
数据范围
输入长度不超过100,保证合法。
输入样例:
((xx|xxx)x|(x|xx))xx
输出样例:
6
分析
数据范围比较小,应该想到用递归来做。
递归问题一般可以画一棵递归搜索树来分析。
具体的策略是:
- 看到"("递归到下一层。
- 看到"|" 取最大值 cnt = max(cnt, dfs());
- 看到"x" 长度+1
- 看到")"返回。
值得注意的是所有递归的出口都是")"
参考代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110;
string str;
int k;
int dfs(){
int res = 0; //设置成局部变量
while(k < str.size()){
if(str[k] == '('){
k ++;
res += dfs();
k ++;
}else if(str[k] == 'x'){
k ++;
res ++;
}else if(str[k] == '|'){
k ++;
res = max(res, dfs()); //这里结束后返回两次,回到"("不需要再 k++
}else if(str[k] == ')'){
break;
}
}
return res;
}
int main (){
cin >> str;
cout << dfs() << endl;
return 0;
}