Java實現 LeetCode 726 原子的數量(遞歸+HashMap處理)

726. 原子的數量

給定一個化學式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;
    }
 
}

726. 原子的數量

給定一個化學式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;
    }
 
}
相關文章
相關標籤/搜索