leecode:726. 原子的数量

题目描述:

给你一个字符串化学式 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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值