33 原子的数量(726)

作者: Turbo时间限制: 1S章节: 递归

晚于: 2020-07-29 12:00:00后提交分数乘系数50%

截止日期: 2020-08-05 12:00:00

问题描述 :

给定一个化学式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}。

注意:

所有原子的第一个字母为大写,剩余字母都是小写。

formula的长度在[1, 1000]之间。

formula只包含字母、数字和圆括号,并且题目中给定的是合法的化学式。

输入说明 :

输入一个字符串,中间不包含空格

输出说明 :

输出一个字符串,表示结果。

输入范例 :

输出范例 :

#include <iostream>
#include <string>
#include <map>
using namespace std;

class Solution {
public:
    bool up(char ch)
    {
        if(ch>='A'&&ch<='Z')
            return true;
        else 
            return false;    
    } 
     
    bool low(char ch)
    {
        if(ch>='a'&&ch<='z')
            return true;
        else 
            return false;    
    } 
    bool num(char ch)
    {
        if(ch>='0'&&ch<='9')
            return true;
        else 
            return false;    
    } 
    
    map<string,int> dfs(string formula,int left,int right)
    {
        string temp;//保存原子
        int count=0;//计算每个原子个数
        map<string,int> M;
        int i=left;
        while(i<=right)
        {
            char ch=formula[i];
            if(up(ch))
            {
                if(!temp.empty())
                {
                    M[temp]+=max(count,1);
                    temp.clear();
                    count=0;
                }
                temp+=ch;
            }
            else if(low(ch))
            {
                temp+=ch;
            }
            else if(num(ch))
            {
                count=count*10+ch-'0';
            }
            else if(ch=='(')
            {
                if(!temp.empty())
                {
                    M[temp]+=max(count,1);
                    temp.clear();
                    count=0;
                }
                int templeft=++i;
                int sum=1;
                while(i<=right&&sum!=0)
                {
                    if(formula[i]=='(')
                        sum++;
                    if(formula[i]==')')
                        sum--;
                    if(sum==0)
                        break;
                    i++;
                }
                
                map<string,int> tm=dfs(formula,templeft,i-1);
                count=0;
                while(i+1<=right&&num(formula[i+1]))
                {
                    count*=10;
                    count+=formula[++i]-'0';
                }
                count=max(count,1);
                for(auto &t:tm)
                    M[t.first]+=t.second*count;
                count=0;
            }
            ++i;    
        }
        if(!temp.empty())
            M[temp]+=max(count,1);
        return M;
    }
    
    string countOfAtoms(string formula) 
    {
           map<string,int> m = dfs(formula, 0, formula.size() - 1);
        string res;
        for (auto& t : m)
        {
            res += t.first;
            if (t.second > 1) 
            {
                res += to_string(t.second);
            }
        }
        return res;
    }
};


int main()
{
    string formula;
    cin>>formula;
    string res=Solution().countOfAtoms(formula);
    cout<<res;
}
原文地址:https://www.cnblogs.com/zmmm/p/13623979.html