输入输出样例
样例1
输入
11
H2+O2=H2O
2H2+O2=2H2O
H2+Cl2=2NaCl
H2+Cl2=2HCl
CH4+2O2=CO2+2H2O
CaCl2+2AgNO3=Ca(NO3)2+2AgCl
3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2
3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH
Cu+As=Cs+Au
输出
N
Y
N
Y
Y
Y
Y
Y
Y
Y
N
题解一
用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');
}
}