package class36; // 来自美团 // () 分值为2 // (()) 分值为3 // ((())) 分值为4 // 也就是说,每包裹一层,分数就是里面的分值+1 // ()() 分值为2 * 2 // (())() 分值为3 * 2 // 也就是说,每连接一段,分数就是各部分相乘,以下是一个结合起来的例子 // (()())()(()) -> (2 * 2 + 1) * 2 * 3 -> 30 // 给定一个括号字符串str,已知str一定是正确的括号结合,不会有违规嵌套 // 返回分数 public class Code04_ComputeExpressionValue { public static int sores(String s) { return compute(s.toCharArray(), 0)[0]; } // s[i.....] 遇到 ')' 或者 终止位置 停! // 返回值:int[] 长度就是2 // 0 :分数是多少 // 1 : 来到了什么位置停的! public static int[] compute(char[] s, int i) { if (s[i] == ')') { return new int[] { 1, i }; } int ans = 1; while (i < s.length && s[i] != ')') { int[] info = compute(s, i + 1); ans *= info[0] + 1; i = info[1] + 1; } return new int[] { ans, i }; } public static void main(String[] args) { String str1 = "(()())()(())"; System.out.println(sores(str1)); // (()()) + (((()))) + ((())()) // (()()) -> 2 * 2 + 1 -> 5 // (((()))) -> 5 // ((())()) -> ((2 + 1) * 2) + 1 -> 7 // 所以下面的结果应该是175 String str2 = "(()())(((())))((())())"; System.out.println(sores(str2)); // (()()()) + (()(())) // (()()()) -> 2 * 2 * 2 + 1 -> 9 // (()(())) -> 2 * 3 + 1 -> 7 // 所以下面的结果应该是63 String str3 = "(()()())(()(()))"; System.out.println(sores(str3)); } }