考虑一种简单的正则表达式:
只由 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; }