https://leetcode-cn.com/problems/number-of-atoms/
思路:对于括号序列问题,一般都可以用递归或者栈来求解。两种解法本质上都是对给定序列进行分层,即遇到左括号进入更深的一层,遇到右括号退出当前层。考虑到每一层中要统计每一个原子出现的次数,我们可以用哈希表来计数,但是结果要求按照字典序排序,因此可以使用
m
a
p
map
map计数,这样可以省去最后的排序步骤。那么如何在给定序列中解析出原子对应的字符串呢?以大写字母开头,后面跟一串小写字母。解析数字比较简单,直接看代码就能看懂。
class Solution {
public:
string countOfAtoms(string formula) {
int curidx=0,n=formula.size();
auto parseAtom=[&]()->string
{
string ans;
ans+=formula[curidx++];
while(curidx<n&&islower(formula[curidx]))
ans+=formula[curidx++];
return ans;
};
auto parseNum=[&]()->int
{
int ans=0;
while(curidx<n&&isdigit(formula[curidx]))
ans=ans*10+formula[curidx++]-'0';
return max(ans,1);
};
stack<map<string,int>> stk;
stk.emplace();
while(curidx<n)
{
if(formula[curidx]=='(')
{
stk.emplace();
++curidx;
}
else if(formula[curidx]==')')
{
map<string,int> cnt=move(stk.top());
stk.pop();
++curidx;
int num=parseNum();
for(auto& pr:cnt)
stk.top()[pr.first]+=pr.second*num;
}
else
{
string atom=move(parseAtom());
int num=parseNum();
stk.top()[atom]+=num;
}
}
string ans;
for(auto& pr:stk.top())
{
ans+=pr.first;
if(pr.second>1)
ans+=to_string(pr.second);
}
return ans;
}
};