字符串递归-第八届蓝桥杯省赛C++A组-正则问题
题目:
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
一个由x()|组成的正则表达式。
输出格式
输出所给正则表达式能接受的最长字符串的长度。
数据范围
输入长度不超过100,保证合法。
输入样例:
((xx|xxx)x|(x|xx))xx
输出样例:
6
题意:
对 表 达 式 ( ( x x ∣ x x x ) x ∣ ( x ∣ x x ) ) x x 而 言 , ′ ∣ ′ 表 示 取 左 右 两 边 较 大 的 长 度 , 如 x x ∣ x x x = x x x ; ′ ( ) ′ 改 变 优 先 级 。 对表达式((xx|xxx)x|(x|xx))xx而言,'|'表示取左右两边较大的长度,如xx|xxx=xxx;'()'改变优先级。 对表达式((xx∣xxx)x∣(x∣xx))xx而言,′∣′表示取左右两边较大的长度,如xx∣xxx=xxx;′()′改变优先级。
那 么 ( ( x x ∣ x x x ) x ∣ ( x ∣ x x ) ) x x = ( x x x x ∣ ( x ∣ x x ) ) x x = ( x x x x ∣ x x ) x x = ( x x x x ) x x = x x x x x x 。 长 度 为 6 。 那么((xx|xxx)x|(x|xx))xx=(xxxx|(x|xx))xx=(xxxx|xx)xx=(xxxx)xx=xxxxxx。长度为6。 那么((xx∣xxx)x∣(x∣xx))xx=(xxxx∣(x∣xx))xx=(xxxx∣xx)xx=(xxxx)xx=xxxxxx。长度为6。
题解:
递 归 搜 索 树 : 递归搜索树: 递归搜索树:
′
(
′
和
′
∣
′
后
面
都
是
表
达
式
,
所
以
每
次
遇
到
′
(
′
和
′
∣
′
就
往
下
递
归
一
层
。
'('和'|'后面都是表达式,所以每次遇到'('和'|'就往下递归一层。
′(′和′∣′后面都是表达式,所以每次遇到′(′和′∣′就往下递归一层。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int k; ///遍历字符串的指针
string str;
int dfs()///计算连续的x的个数
{
int res=0;
while(k<str.size())
{
if(str[k]=='(')
{
k++; ///跳过'('
res+=dfs(); ///dfs到')'退出后k++跳过'('
k++;
}
else if(str[k]=='|')
{
k++; ///跳过'|'
res=max(res,dfs()); ///左边与右边的最大值
}
else if(str[k]==')')
{
//k++;
///这里k++应该在左括号里完成,否则会重复计算
break;
}
else
{
res++; ///增加一个x
k++; ///指针移动
}
}
return res;
}
int main()
{
cin>>str;
cout<<dfs()<<endl;
return 0;
}