zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Ping pong
    [NOIp2015普及组]推销员
    [模板]树状数组
    [洛谷201704R1]开心派对小火车
    洛谷P3515 [POI2011]Lightning Conductor(决策单调性)
    bzoj1560:[JSOI2009]火星藏宝图(斜率优化)
    (转载)行走在镜面的边缘
    洛谷P4360 [CEOI2004]锯木厂选址(斜率优化)
    洛谷P4072 [SDOI2016]征途(斜率优化)
    洛谷P3648 [APIO2014]序列分割(斜率优化)
  • 原文地址:https://www.cnblogs.com/zmmm/p/13623979.html
Copyright © 2011-2022 走看看