原题链接:蓝桥杯2017年第八届真题-正则问题
import java.util.*;
import java.math.*;
public class Main {
static char[] arr;
static int index = 0 ;//全局变量控制位置
public static void main(String[]args) {
Scanner in = new Scanner(System.in);
String s = in.next();
arr = s.toCharArray();//装 输入的字符串
int ans = dfs();
System.out.print(ans);
}
public static int dfs(){
int kuo = 0;//如果遇到右括号则return
int left = 0, right = 0;
boolean lr = false;//判断在|左边或右边
boolean shu = false;//判断是否遇到过|
while(index < arr.length) {//控制在字符串内
if(arr[index] == 'x') {
// 如果在|左边 / 如果在|右边
if(!lr)left++;
else right++;
}
else if(arr[index] == '(') {//如果遇到左括号则进入下一层,记得要index++否则死循环
index++;
int re = dfs();//存储括号里返回的值
// 若此值在右边则加到right 反之亦然
if(lr) right += re;
else left += re;
}
else if(arr[index] == '|') {
// 如果是第一次遇到则不用比较,将shu和lr变为true,从此记录|右边的x的数量
if(!shu) {
shu = true;
lr = true;
}
if(shu) {
// 第i次(i > 1)遇到|,由于left和right都被占了所以需要选取最大值来空出right
left = left > right ? left : right;
right = 0;
}
}
else {//遇到右括号 kuo--变为-1,return,由于此重会index++,回到上层index再一次++所以先index--一次
kuo--;
index--;
}
index ++;
if(kuo < 0 )return left > right ? left : right;
}
// 最后一次返回 由于没有括号所以不会触发上行语句
return left > right ? left : right;
}
}解题思路:
注意事项:
参考代码:
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复