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 人评分
A+B for Input-Output Practice (C++代码)浏览:605 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:885 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:1282 |
C语言训练-数字母 (C语言代码)浏览:649 |
简单的for循环浏览:1408 |
C语言训练-自由落体问题 (C语言代码)浏览:610 |
Tom数 (C语言代码)浏览:725 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:681 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:548 |
数列有序 (C语言代码)浏览:930 |