1,确定一个最小的处理单位是 一层括号加后面出现的数字。
2. 对括号的递归处理,以及对后面数字的处理。
3.原子之间的分隔以大写字母 和 左括号标志。借此标志来分离各个原子。
class Solution {
public:
bool isuper(char c){
if(c<='Z'&&c>='A') return true;
return false;
}
bool islowe(char c){
if(c<='z'&&c>='a') return true;
return false;
}
bool isdig(char c){
if(c>='0'&&c<='9') return true;
return false;
}
map<string,int> parse(string s,int l,int r){
map<string,int> ans;
string autm;
int count=0;
int i=l;
while(i<=r){
char tp=s[i];
if(isuper(tp)){
if(!autm.empty()){
ans[autm]+=max(count,1);
count=0;
autm.clear();
}
autm+=tp;
}
if(isdig(tp)){
count*=10;
count+=tp-'0';
}
if(islowe(tp)) autm+=tp;
if(tp=='('){
if(!autm.empty()){
ans[autm]+=max(count,1);
count=0;
autm.clear();
}
int buk=1,tl=++i;
while(buk&&i<=r){
if(s[i]=='(') buk++;
if(s[i]==')') buk--;
i++;
}
map<string,int> m1=parse(s,tl,i-1);
count=0;
while(i<=r&&isdig(s[i])){
count*=10;
count+=s[i]-'0';
i++;
}
i--;
count=max(count,1);
for(auto p: m1){
ans[p.first]+=p.second*count;
}
count=0;
}
i++;
}
if(!autm.empty()){
ans[autm]+=max(count,1);
}
return ans;
}
string countOfAtoms(string formula) {
auto m=parse(formula,0,formula.size()-1);
string ans="";
for(auto p:m){
ans+=p.first;
if(p.second>1){
ans+=to_string(p.second);
}
}
return ans;
}
};