您当前的位置: 首页 >  蓝桥杯

2017年第八届蓝桥杯 - 省赛 - C/C++大学A组 - G. 正则问题

发布时间:2022-01-18 21:25:39 ,浏览量:0

描述:正则问题

考虑一种简单的正则表达式: 只由 x ( ) | 组成的正则表达式。 小明想求出这个正则表达式能接受的最长字符串的长度。

例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。

输入

一个由x()|组成的正则表达式。输入长度不超过100,保证合法。

输出

这个正则表达式能接受的最长字符串的长度。

例如, 输入: ((xx|xxx)x|(x|xx))xx

程序应该输出: 6

资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

注意: main函数需要返回0; 只使用ANSI C/ANSI C++ 标准; 不要调用依赖于编译环境或操作系统的特殊函数。 所有依赖的函数必须明确地在源文件中 #include 不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

Ideas

遇到括号匹配类似的问题,首先想到的就是用栈。

如果用栈的话有两种:① 递归用系统栈;② 自定义栈用迭代。

这里我们通过递归来实现。

这道题是想让我们求最长的x字符串长度,所以其实我们可以直接递归求长度,不再用字符串做计算了。

首先我们需要遍历整个字符串,由于是递归遍历,所有我们需要定义一个全局变量pos表示当前遍历到的位置索引。

然后我们先来考虑遇到|符号:|肯定连接了两个x字符串,我们要求其中最大的那个,所以需要定义两个变量:tmp和res,分别表示|左边的x串和右边的x串长度。

初始化tmp和res都是0,然后遇到x时让 pos + 1, tmp + 1。

此时如果遇到|,此时我们让res = max(res, tmp),然后置 tmp 为0,代表tmp要计算|后面的长度。

如果遇到),同样也让res = max(res, tmp),然后返回 res。

如果遇到(,那么应该先累加pos,然后开启一个新的递归。

Code C++
#include  #include  #include  using namespace std; char s[100]; int len,pos; int f() { int m = 0, tmp = 0; while(pos<len) { switch(s[pos]) { case '(': { pos++; tmp += f(); break; } case ')': { pos++; m = max(m, tmp); return m; } case 'x': { pos++; tmp++; break; } case '|': { pos++; m = max(m, tmp); tmp = 0; break; } } } m = max(m, tmp); return m; } int main() { cin >> s; len = strlen(s); int ans = f(); cout << ans << endl; return 0; } 
Python
def dfs(): global pos
    res, tmp = 0, 0 while pos < len(s): if s[pos] == '(': pos += 1 tmp += dfs() elif s[pos] == ')': pos += 1 res = max(res, tmp) return res elif s[pos] == 'x': pos += 1 tmp += 1 elif s[pos] == '|': pos += 1 res = max(res, tmp) tmp = 0 res = max(res, tmp) return res if __name__ == '__main__': pos = 0 s = input().strip() print(dfs()) 
在线评测:https://www.acwing.com/problem/content/1227/
关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    108697博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0492s