LeetCode 726题
这个我是觉得写的不错的
想+写+debug,接近3小时
class Solution {
public String countOfAtoms(String formula) {
int length = formula.length();
StringBuilder atomSb = new StringBuilder();
StringBuilder numSb = new StringBuilder();
Stack<String> atomStack = new Stack<>();
Stack<String> numStack = new Stack<>();
Map<String, String> resMap = new HashMap<>();
for(int i = 0; i < length;){
char temp = formula.charAt(i);
if(temp == '('){
atomStack.add(String.valueOf(temp));
i++;
continue;
}else if(temp == ')'){
i++;
while (i < length && formula.charAt(i) <= 57 && formula.charAt(i) >= 48 ){
numSb.append(formula.charAt(i));
i++;
}
doCal(atomStack, numStack, resMap, numSb.toString());
numSb = new StringBuilder();
continue;
}
if(temp <= 90 && temp >= 65){
atomSb.append(temp);
i++;
while (i < length && formula.charAt(i) <= 122 && formula.charAt(i) >= 97){
atomSb.append(formula.charAt(i));
i++;
}
while (i < length && formula.charAt(i) <= 57 && formula.charAt(i) >= 48){
numSb.append(formula.charAt(i));
i++;
}
if(atomStack.isEmpty()){
String value = resMap.getOrDefault(atomSb.toString(), "0");
if(numSb.length() == 0){
resMap.put(atomSb.toString(), String.valueOf((Integer.parseInt(value)+1)));
}else{
resMap.put(atomSb.toString(), String.valueOf((Integer.parseInt(value)+Integer.parseInt(numSb.toString()))));
}
}else{
atomStack.add(atomSb.toString());
if(numSb.length() == 0){
numStack.add("1");
}else{
numStack.add(numSb.toString());
}
}
atomSb = new StringBuilder();
numSb = new StringBuilder();
}
}
StringBuilder res = new StringBuilder();
Object[] objects = resMap.keySet().toArray();
Arrays.sort(objects);
for(int i = 0; i < resMap.size(); i++){
res.append(objects[i]);
if(!resMap.get(objects[i]).equals("1")){
res.append(resMap.get(objects[i]));
}
}
return res.toString();
}
public void doCal(Stack<String> atomStack, Stack<String> numStack, Map<String, String> resMap, String number){
Map<String, String> tempMap = new HashMap<>();
int mutipy;
if(number.length() == 0){
mutipy = 1;
}else{
mutipy = Integer.parseInt(number);
}
while (!atomStack.peek().equals("(")){
String pop = atomStack.pop();
String value = tempMap.getOrDefault(pop, "0");
if(value.equals("0")){
tempMap.put(pop, String.valueOf(Integer.parseInt(numStack.pop()) * mutipy));
}else{
tempMap.put(pop, String.valueOf(Integer.parseInt(numStack.pop()) * mutipy +Integer.parseInt(value)));
}
}
atomStack.pop();
if(atomStack.isEmpty()){
for(Map.Entry entry: tempMap.entrySet()){
String value = resMap.getOrDefault(entry.getKey(), "0");
resMap.put((String)entry.getKey(), String.valueOf(Integer.parseInt(value)+Integer.parseInt((String) entry.getValue())));
}
}else{
for(Map.Entry entry: tempMap.entrySet()){
atomStack.add((String) entry.getKey());
numStack.add((String)entry.getValue());
}
}
}
}