【Lintcode】1090. Map Sum Pairs

題目地址:

https://www.lintcode.com/problem/map-sum-pairs/description

要求實現一個數據結構,可以實現如下操作:
1、加進一個字符串和其對應的val值;
2、給定一個字符串,求所有存在在該數據結構裏的以這個字符串爲前綴的字符串對應的val之和。

思路是Trie + DFS。加入字符串可以用Trie裏的添加來實現,並且要將Node類裏新加一個變量val,記錄字符串對應的值。查找和的時候,只需先找到Trie裏那個前綴最後一個字符的Node,如果找不到則說明沒有字符串以它爲前綴,返回00,否則對這個Node進行DFS,把和加總即可。代碼如下:

public class MapSum {
    
    class Node {
        boolean isWord;
        int val;
        Node[] nexts;
        Node() {
            nexts = new Node[26];
        }
    }
    
    Node root;
    
    /** Initialize your data structure here. */
    public MapSum() {
        root = new Node();
    }
    
    public void insert(String key, int val) {
        Node cur = root;
        for (int i = 0; i < key.length(); i++) {
            char c = key.charAt(i);
            if (cur.nexts[c - 'a'] == null) {
                cur.nexts[c - 'a'] = new Node();
            }
            cur = cur.nexts[c - 'a'];
        }
        
        cur.isWord = true;
        cur.val = val;
    }
    
    public int sum(String prefix) {
        if (prefix == null || prefix.isEmpty()) {
            return 0;
        }
        
        Node cur = root;
        for (int i = 0; i < prefix.length(); i++) {
            char c = prefix.charAt(i);
            if (cur.nexts[c - 'a'] == null) {
                return 0;
            }
            cur = cur.nexts[c - 'a'];
        }
        
        return dfs(cur);
    }
    
    private int dfs(Node root) {
        if (root == null) {
            return 0;
        }
        
        int sum = root.val;
        for (int i = 0; i < root.nexts.length; i++) {
            sum += dfs(root.nexts[i]);
        }
        
        return sum;
    }
}

insert時間複雜度O(l)O(l)ll爲字符串長度,sum的時間複雜度與具體存了哪些字符串有關。空間複雜度也與具體存了哪些字符串有關,但當單詞足夠多的時候,由於共用了很多前綴,空間遠小於O(nl)O(nl)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章