LeetCode 726.原子的数量

题目描述

给定一个化学式formula(作为字符串),返回每种原子的数量。
原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字。
如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。例如,H2O 和 H2O2 是可行的,但 H1O2 这个表达是不可行的。
两个化学式连在一起是新的化学式。例如 H2O2He3Mg4 也是化学式。
一个括号中的化学式和数字(可选择性添加)也是化学式。例如 (H2O2) 和 (H2O2)3 是化学式。
给定一个化学式 formula ,返回所有原子的数量。格式为:第一个(按字典序)原子的名字,跟着它的数量(如果数量大于 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 是有效的化学式。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-atoms
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

贴出代码如下:

class Solution {
public:
    stack<int> st;
    map<string,int> mp;
    string reverse(string f)
    {
        string str = "";
        int len = f.length();	
        for(int i = len - 1; i >= 0; i--){
            str += f[i];	
        }
        return str;
    }
    string countOfAtoms(string fomula)
    {
        int len = fomula.length();
        string f = "";
        while(len > 0){
            if(fomula[len - 1]>='0' && fomula[len - 1]<='9'){
                if(fomula[len]>='0' && fomula[len]<='9')	{
                    int i = st.top();
                    st.pop();
                    int tmp = (fomula[len - 1] - '0')*10;
                    if(!st.empty()){
                        int i2 = st.top();
                        tmp *= i2;
                    }
                    tmp += i;
                    st.push(tmp);
                }	
                else{
                    int tmp = fomula[len - 1] - '0';
                    if(!st.empty()){
                        int i = st.top();
                        tmp *= i;
                    }
                    st.push(tmp);
                }		
            }
            else if(fomula[len - 1]>='A' && fomula[len - 1] <= 'Z'){
                if(len == fomula.length() || ( fomula[len] >= 'A' && fomula[len] <= 'Z') || fomula[len] == ')' || fomula[len] == '('){
                    if(!st.empty()){
                        int i = st.top();
                        st.push(i);			
                    }				
                    else
                        st.push(1);	
                }
                f += fomula[len - 1];
                f = reverse(f);
                int i = st.top();
                st.pop();
                if(mp.find(f) != mp.end()){
                    mp.find(f)->second += i;			
                }else
                    mp.insert(make_pair(f,i));
                f = "";
            }	
            else if(fomula[len - 1]>='a' && fomula[len - 1] <= 'z'){
                if(len == fomula.length() || (fomula[len] >= 'A' && fomula[len] <= 'Z') || fomula[len] == ')' || fomula[len] == '('){
                    if(!st.empty()){
                        int i = st.top();
                        st.push(i);			
                    }				
                    else
                        st.push(1);
                }
                f += fomula[len - 1];
            }
            else if(fomula[len-1] == '('){
                if(!st.empty())
                    st.pop();
            }
            len--;
        }
        map<string,int>::iterator it;
        string result = "";
        for(it = mp.begin(); it != mp.end(); it++){
            if(it->second <= 1){
                result += it->first;
            }		
            else{
                result += it->first;
                result += to_string(it->second);			
            }
        }
        return result;
    }
};

提交结果如下:

提交结果

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值