原题链接:蓝桥杯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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复