考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
一个由x()|组成的正则表达式。
输出格式
输出所给正则表达式能接受的最长字符串的长度。
数据范围
输入长度不超过100,保证合法。
输入样例:
((xx|xxx)x|(x|xx))xx
输出样例:
6
题意是在规则之下的xxxxx…的最大长度
规则1:() 的意思是有括号的先算括号里面的,优先级最高,把括号计算的结果在和括号外的字符拼接,即括号是相对独立,完整的个体
规则2:|的意思是|这个符号两侧的字符串只能选其中一个,由于这题要求能拼接的字符串最长,因此应该选择字符|字符串xxx...长度较大的一侧
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std ;
int k ;
string str ;
int dfs(){
int res = 0 ;
while(k<str.size()){
if( str[k] == '(' ){
k ++ ;
res += dfs() ;
k ++ ;
}else if(str[k] == ')'){
// k ++ ;
break ;
}else if(str[k] == '|'){
k ++ ;
res = max(res,dfs()) ;//((xx|xxx)x|(x|xx))xx
}else{
k ++ ;
res ++ ;
}
}
return res ;
}
int main(){
cin >> str ;
cout << dfs() << endl ;
return 0 ;
}
if(str[k] == '('){
k ++ ;
res += dfs() ;
k ++ ;
第二个k++
的作用是跳过右括号)
。因为在处理括号内的表达式时,我们需要先递归处理左括号(
内的内容,然后再跳过右括号)
,继续处理后面的字符。所以需要两个k++
操作。