classSolution{public:stringcountOfAtoms(stringformula){stringans;inti=0;for(constauto&[elem,freq]:parse(formula,i)){ans+=elem;if(freq>1)ans+=to_string(freq);}returnans;}private:map<string,int>parse(conststring&s,int&i){map<string,int>count;while(i<s.length())if(s[i]=='('){for(constauto&[elem,freq]:parse(s,++i))count[elem]+=freq;}elseif(s[i]==')'){constintnum=getNum(s,++i);for(auto&&[_,freq]:count)freq*=num;returncount;// Returns back to previous scope}else{// s[i] must be uppercasedconststring&elem=getElem(s,i);constintnum=getNum(s,i);count[elem]+=num;}returncount;}stringgetElem(conststring&s,int&i){constintelemStart=i++;// s[elemStart] is uppercasedwhile(i<s.length()&&islower(s[i]))++i;returns.substr(elemStart,i-elemStart);}intgetNum(conststring&s,int&i){constintnumStart=i;while(i<s.length()&&isdigit(s[i]))++i;conststring&numString=s.substr(numStart,i-numStart);returnnumString.empty()?1:stoi(numString);}};
classSolution{publicStringcountOfAtoms(Strings){StringBuildersb=newStringBuilder();Map<String,Integer>count=parse(s);for(finalStringelem:count.keySet())sb.append(elem+(count.get(elem)==1?"":String.valueOf(count.get(elem))));returnsb.toString();}privateinti=0;privateMap<String,Integer>parse(Strings){Map<String,Integer>count=newTreeMap<>();while(i<s.length())if(s.charAt(i)=='('){++i;// Skip '('for(Map.Entry<String,Integer>entry:parse(s).entrySet()){finalStringelem=entry.getKey();finalintfreq=entry.getValue();count.put(elem,count.getOrDefault(elem,0)+freq);}}elseif(s.charAt(i)==')'){++i;// Skip ')'finalintnum=getNum(s);for(finalStringelem:count.keySet()){finalintfreq=count.get(elem);count.put(elem,freq*num);}returncount;// Returns back to previous scope}else{finalStringelem=getElem(s);finalintnum=getNum(s);count.put(elem,count.getOrDefault(elem,0)+num);}returncount;}privateStringgetElem(finalStrings){finalintelemStart=i++;// s[elemStart] is uppercasedwhile(i<s.length()&&Character.isLowerCase(s.charAt(i)))++i;returns.substring(elemStart,i);}privateintgetNum(finalStrings){finalintnumStart=i;while(i<s.length()&&Character.isDigit(s.charAt(i)))++i;finalStringnumString=s.substring(numStart,i);returnnumString.isEmpty()?1:Integer.parseInt(numString);}}