677. 键值映射

实现一个 MapSum 类里的两个方法,insert 和 sum。
对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。
对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。

示例 1:
输入: insert("apple", 3), 输出: Null
输入: sum("ap"), 输出: 3
输入: insert("app", 2), 输出: Null
输入: sum("ap"), 输出: 5

import java.util.HashMap;
import java.util.Map;

public class MapSum {

    private class Node{
        public int value;
        public Map next;

        public Node(int value) {
            this.value = value;
            next = new HashMap<>();
        }

        public Node() {
            this(0);
        }
    }

    private Node root;

    /** Initialize your data structure here. */
    public MapSum() {
        root = new Node();
    }

    public void insert(String key, int val) {
        insert(root, key, val, 0);
    }

    private void insert(Node node, String key, int val, int index) {
        if (key.length() == index) {
            node.value = val;
            return;
        }

        char c = key.charAt(index);

        if (node.next.get(c) == null) {
            node.next.put(c , new Node());
        }

        insert(node.next.get(c), key, val, index + 1);
    }

    public int sum(String prefix) {
        Node cur = root;
        for (int i = 0; i < prefix.length(); i++) {
            if (cur.next.get(prefix.charAt(i)) == null) {
                return 0;
            }

            cur = cur.next.get(prefix.charAt(i));
        }
        return sum(cur);
    }

    private int sum(Node node) {
        int val = node.value;

        for (Character character : node.next.keySet()) {
            val += sum(node.next.get(character));
        }

        return val;
    }
}

/**
 * Your MapSum object will be instantiated and called as such:
 * MapSum obj = new MapSum();
 * obj.insert(key,val);
 * int param_2 = obj.sum(prefix);
 */

你可能感兴趣的:(677. 键值映射)