第八届蓝桥杯省赛C++A组 正则问题

    科技2022-07-15  141

    考虑一种简单的正则表达式:

    只由 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; }
    Processed: 0.008, SQL: 8