題目地址:
https://www.lintcode.com/problem/map-sum-pairs/description
要求實現一個數據結構,可以實現如下操作:
1、加進一個字符串和其對應的val值;
2、給定一個字符串,求所有存在在該數據結構裏的以這個字符串爲前綴的字符串對應的val之和。
思路是Trie + DFS。加入字符串可以用Trie裏的添加來實現,並且要將Node類裏新加一個變量val,記錄字符串對應的值。查找和的時候,只需先找到Trie裏那個前綴最後一個字符的Node,如果找不到則說明沒有字符串以它爲前綴,返回,否則對這個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時間複雜度,爲字符串長度,sum的時間複雜度與具體存了哪些字符串有關。空間複雜度也與具體存了哪些字符串有關,但當單詞足夠多的時候,由於共用了很多前綴,空間遠小於。