正则问题
正则问题
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
一个由x()|组成的正则表达式。
输出格式
输出所给正则表达式能接受的最长字符串的长度。
数据范围
输入长度不超过100,保证合法。
输入样例:
((xx|xxx)x|(x|xx))xx
输出样例:
6
解题思路
我到现在都不明白为什么这题用递归做。
这个正则表达式的逻辑对应一颗二叉树。
树中有两种符号:
- '|':两者取其一。
- '&':链接两个字符串。
这些符号都是每棵子树的根节点,而'x'为叶子结点。
AC代码如下:
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 const int N = 110; 7 8 string str; 9 int k; 10 11 int dfs() { 12 int ret = 0; 13 while (k < str.size()) { 14 if (str[k] == '(') { // 处理(......) 15 k++; // 跳过'(' 16 ret += dfs(); 17 k++; // 跳过')' 18 } 19 else if (str[k] == ')') { 20 break; 21 } 22 else if (str[k] == '|') { 23 k++; // 跳过'|' 24 ret = max(ret, dfs()); 25 } 26 else { 27 k++; // 跳过'x' 28 ret++; 29 } 30 } 31 32 return ret; 33 } 34 35 int main() { 36 cin >> str; 37 cout << dfs(); 38 39 return 0; 40 }
参考资料
AcWing 1225. 正则问题(蓝桥杯C++ AB组辅导课):https://www.acwing.com/video/768/
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/15973306.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效