输入输出样例
样例1
输入
11H2+O2=H2O2H2+O2=2H2OH2+Cl2=2NaClH2+Cl2=2HClCH4+2O2=CO2+2H2OCaCl2+2AgNO3=Ca(NO3)2+2AgCl3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)23Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOHCu+As=Cs+Au
输出
NYNYYYYYYYN
题解一
用Map来存储化学元素及其次数。难点在于嵌套括号的处理。100分。
参考:https://blog.csdn.net/qq_18287147/article/details/106981698?utm_medium=distribute.pc_relevant_download.none-task-blog-blogcommendfrombaidu-1.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-blogcommendfrombaidu-1.nonecas
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map;public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(reader.readLine());for (int i = 0; i < n; ++i) {String raw = reader.readLine();String[] strs = raw.split("=");String left = strs[0];String right = strs[1];Map<String, Integer> mapA = handle(left);Map<String, Integer> mapB = handle(right);// System.out.println(mapA);// System.out.println(mapB);// System.out.println(mapA.equals(mapB));if (mapA.equals(mapB)){System.out.println("Y");}else {System.out.println("N");}}}private static Map<String, Integer> handle(String s) {Map<String, Integer> ans = new HashMap<>();for (String str : s.split("\\+")) {// System.out.println(str);int coef = 0;int i;for (i = 0; i < str.length(); ++i) {char ch = str.charAt(i);if (isDigit(ch)) {coef = coef * 10 + ch - 48;} else {break;}}handlePart(ans, str, i, str.length() - 1, Math.max(1, coef));}return ans;}private static void handlePart(Map<String, Integer> map, String s, int left, int right, int coef) {int i = left;while (i <= right) {if (s.charAt(i) == '(') { // 找到与这个左括号对应的右括号, 递归解析int depth = 1;int index;for (index = i + 1, depth = 1; depth > 0; ++index) {if (s.charAt(index) == '(') {++depth;} else if (s.charAt(index) == ')') {--depth;}}// 右括号左侧一位int r = index - 2;// 角标倍数int x = 0;while ((index <= right) && (isDigit(s.charAt(index)))) {x = x * 10 + s.charAt(index) - 48;++index;}handlePart(map, s, i + 1, r, Math.max(coef, coef * x));i = index;} else if (s.charAt(i) == ')') {++i;} else { // 化学元素首大写字母StringBuilder sBuilder = new StringBuilder();sBuilder.append(s.charAt(i));++i;while ((i <= right) && (isLowerCase(s.charAt(i)))) {sBuilder.append(s.charAt(i));++i;}// 元素符号String element = sBuilder.toString();// 角标倍数int x = 0;while ((i <= right) && (isDigit(s.charAt(i)))) {x = x * 10 + s.charAt(i) - 48;++i;}map.put(element, (int) map.getOrDefault(element, 0) + Math.max(coef, x * coef));}}}private static boolean isDigit(char ch) {return (ch >= '0') && (ch <= '9');}private static boolean isLowerCase(char ch) {return (ch >= 'a') && (ch <= 'z');}}
