题目描述
给定一个化学式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;
}
};
提交结果如下: