給定一個化學式formula(做爲字符串),返回每種原子的數量。java
原子老是以一個大寫字母開始,接着跟隨0個或任意個小寫字母,表示原子的名字。git
若是數量大於 1,原子後會跟着數字表示原子的數量。若是數量等於 1 則不會跟數字。例如,H2O 和 H2O2 是可行的,但 H1O2 這個表達是不可行的。app
兩個化學式連在一塊兒是新的化學式。例如 H2O2He3Mg4 也是化學式。ide
一個括號中的化學式和數字(可選擇性添加)也是化學式。例如 (H2O2) 和 (H2O2)3 是化學式。ui
給定一個化學式,輸出全部原子的數量。格式爲:第一個(按字典序)原子的名子,跟着它的數量(若是數量大於 1),而後是第二個原子的名字(按字典序),跟着它的數量(若是數量大於 1),以此類推。spa
示例 1:code
輸入:
formula = 「H2O」
輸出: 「H2O」
解釋:
原子的數量是 {‘H’: 2, ‘O’: 1}。
示例 2:orm
輸入:
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}。
注意:get
全部原子的第一個字母爲大寫,剩餘字母都是小寫。
formula的長度在[1, 1000]之間。
formula只包含字母、數字和圓括號,而且題目中給定的是合法的化學式。
class Solution { private int i; public String countOfAtoms(String formula) { StringBuilder sb = new StringBuilder(); Map<String, Integer> map = parse(formula); for(Map.Entry<String, Integer> entry: map.entrySet()) { sb.append(entry.getKey()); Integer val = entry.getValue(); sb.append(val == 1 ? "" : val.toString()); } return sb.toString(); } public Map<String, Integer> parse(String formula) { Map<String, Integer> map = new TreeMap<>(); int n = formula.length(); while(i < n && formula.charAt(i) != ')') { if(formula.charAt(i) == '(') { i++; Map<String, Integer> innerMap = parse(formula); for(Map.Entry<String, Integer> entry: innerMap.entrySet()) { map.put(entry.getKey(), entry.getValue() + map.getOrDefault(entry.getKey(), 0)); } } else { String letter = ""; int iStart = i++; while(i < n && Character.isLowerCase(formula.charAt(i))) { i++; } letter = formula.substring(iStart, i); iStart = i; while(i < n && Character.isDigit(formula.charAt(i))) { i++; } int count = i == iStart ? 1 : Integer.valueOf(formula.substring(iStart, i)); if(!letter.isEmpty()) { map.put(letter, map.getOrDefault(letter, 0) + count); } } } if(i >= n) return map; int iStart = ++i; while(i < n && Character.isDigit(formula.charAt(i))) { i++; } int factor = Integer.valueOf(formula.substring(iStart, i)); for(Map.Entry<String, Integer> entry: map.entrySet()) { map.put(entry.getKey(), entry.getValue() * factor); } return map; } }
給定一個化學式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只包含字母、數字和圓括號,而且題目中給定的是合法的化學式。
class Solution { private int i; public String countOfAtoms(String formula) { StringBuilder sb = new StringBuilder(); Map<String, Integer> map = parse(formula); for(Map.Entry<String, Integer> entry: map.entrySet()) { sb.append(entry.getKey()); Integer val = entry.getValue(); sb.append(val == 1 ? "" : val.toString()); } return sb.toString(); } public Map<String, Integer> parse(String formula) { Map<String, Integer> map = new TreeMap<>(); int n = formula.length(); while(i < n && formula.charAt(i) != ')') { if(formula.charAt(i) == '(') { i++; Map<String, Integer> innerMap = parse(formula); for(Map.Entry<String, Integer> entry: innerMap.entrySet()) { map.put(entry.getKey(), entry.getValue() + map.getOrDefault(entry.getKey(), 0)); } } else { String letter = ""; int iStart = i++; while(i < n && Character.isLowerCase(formula.charAt(i))) { i++; } letter = formula.substring(iStart, i); iStart = i; while(i < n && Character.isDigit(formula.charAt(i))) { i++; } int count = i == iStart ? 1 : Integer.valueOf(formula.substring(iStart, i)); if(!letter.isEmpty()) { map.put(letter, map.getOrDefault(letter, 0) + count); } } } if(i >= n) return map; int iStart = ++i; while(i < n && Character.isDigit(formula.charAt(i))) { i++; } int factor = Integer.valueOf(formula.substring(iStart, i)); for(Map.Entry<String, Integer> entry: map.entrySet()) { map.put(entry.getKey(), entry.getValue() * factor); } return map; } }