题目描述:
给你一个字符串化学式 formula ,返回 每种原子的数量 。
原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。
如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。
例如,“H2O” 和 “H2O2” 是可行的,但 “H1O2” 这个表达是不可行的。
两个化学式连在一起可以构成新的化学式。
例如 “H2O2He3Mg4” 也是化学式。
由括号括起的化学式并佐以数字(可选择性添加)也是化学式。
例如 “(H2O2)” 和 “(H2O2)3” 是化学式。
返回所有原子的数量,格式为:第一个(按字典序)原子的名字,跟着它的数量(如果数量大于 1),然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。
示例 1:
输入:formula = “H2O”
输出:“H2O”
解释:原子的数量是 {‘H’: 2, ‘O’: 1}。
示例 2:
输入:formula = “Mg(OH)2”
输出:“H2MgO2”
解释:原子的数量是 {‘H’: 2, ‘Mg’: 1, ‘O’: 2}。
示例 3:
输入:formula = “K4(ON(SO3)2)2”
输出:“K4N2O14S4”
解释:原子的数量是 {‘K’: 4, ‘N’: 2, ‘O’: 14, ‘S’: 4}。
示例 4:
输入:formula = “Be32”
输出:“Be32”
提示:
1 <= formula.length <= 1000
formula 由英文字母、数字、’(’ 和 ‘)’ 组成
formula 总是有效的化学式
输出的所有值总是在 32-bit 整数范围内
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-atoms
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解析:
遇到左括号进入递归,遇到右括号递归结束,使用map存储原子信息,递归结束返回map加入上一层map中。
代码:
class Solution {
//指针,全局变量
int index=0;
public:
map<string,int> stasticAtoms(string &formula){
//深一层括号返回map
map<string,int> lastMap;
//当前括号层map
map<string,int> nextMap;
//遍历到头结束
while(index<formula.size()){
if(formula[index]=='('){
//跳过左括号
index+=1;
lastMap=stasticAtoms(formula);
//合并两个map
for(map<string,int>::iterator it=lastMap.begin();it!=lastMap.end();it++)
{
nextMap[it->first]+=it->second;
}
}
//右括号递归结束,返回
else if(formula[index]==')'){
int nums=0;
//跳过右括号
index+=1;
//获取括号外的数
while(index<formula.size()&&formula[index]>='0'&&formula[index]<='9'){
nums=nums*10+(formula[index]-'0');
index++;
}
//如果没数
if(nums==0)
nums=1;
//将要返回map中的元素*nums;
for(map<string,int>::iterator it=nextMap.begin();it!=nextMap.end();it++)
{
//cout<<it->first<<"::"<<it->second<<endl;
it->second=(it->second)*nums;
}
//return ;
return nextMap;
}
else{
//字母(**)
string cur="";
cur+=formula[index];
index++;
if(index<formula.size()&&'a'<=formula[index]&&formula[index]<='z')
{
cur+=formula[index];
index++;
}
//处理括号之间的元素---数字
int nums=0;
while(index<formula.size()&&formula[index]>='0'&&formula[index]<='9'){
nums=nums*10+formula[index]-'0';
index++;
}
//两者组合放入map,同样考虑没有数的情况
if(nums==0)
nums=1;
//cout<<index-1<<"::"<<cur<<"::"<<nums<<endl;
nextMap[cur]+=nums;
}
}
return nextMap;
}
string countOfAtoms(string formula) {
map<string,int> atoms;
atoms=stasticAtoms(formula);
string s="";
//字符串拼凑
for(map<string,int>::iterator it=atoms.begin();it!=atoms.end();it++)
{
s+=it->first;
if(it->second!=1)
s+=to_string(it->second);
}
return s;
}
};