日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode677. 键值映射(Trie树)

發(fā)布時(shí)間:2024/7/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode677. 键值映射(Trie树) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 題目

實(shí)現(xiàn)一個(gè) MapSum 類里的兩個(gè)方法,insert 和 sum。

對(duì)于方法 insert,你將得到一對(duì)(字符串,整數(shù))的鍵值對(duì)。字符串表示鍵,整數(shù)表示值。如果鍵已經(jīng)存在,那么原來(lái)的鍵值對(duì)將被替代成新的鍵值對(duì)。

對(duì)于方法 sum,你將得到一個(gè)表示前綴的字符串,你需要返回所有以該前綴開頭的鍵的值的總和。

輸入: insert("apple", 3), 輸出: Null 輸入: sum("ap"), 輸出: 3 輸入: insert("app", 2), 輸出: Null 輸入: sum("ap"), 輸出: 5

2. Trie樹解題

參考:Trie樹

class TrieNode { public:TrieNode *next[26];int count;TrieNode():count(0){memset(next,NULL,26*sizeof(TrieNode*));}~TrieNode(){} };class MapSum {TrieNode *root; public:/** Initialize your data structure here. */MapSum() {root = new TrieNode();}void insert(string key, int val) {TrieNode *cur = root;for(char ch:key){if(cur->next[ch-'a'] == NULL)cur->next[ch-'a'] = new TrieNode();cur = cur->next[ch-'a'];}cur->count = val;}int sum(string prefix) {TrieNode *cur = root;for(char ch:prefix){if(cur->next[ch-'a'] == NULL)return 0;elsecur = cur->next[ch-'a'];}int sumVal = 0;sumVal += cur->count;for(int i = 0; i < 26; ++i)if(cur->next[i])sumVal += sum(cur->next[i]);return sumVal;} private:int sum(TrieNode *root)//遞歸求和{int subsum = 0;if(root == NULL)return 0;subsum += root->count;for(int i = 0; i < 26; ++i)if(root->next[i])subsum += sum(root->next[i]);return subsum;} };

class trie{ // 2021.8.28 public:int v = 0;trie* next[26] = {NULL};void insert(string& s, int val){trie* cur = this;for(auto ch : s){if(!cur->next[ch-'a'])cur->next[ch-'a'] = new trie();cur = cur->next[ch-'a'];}cur->v = val;}void find(trie* root, string& s, int i, int &sum){if(!root) return;if(i<s.size()&&root->next[s[i]-'a'])find(root->next[s[i]-'a'], s, i+1, sum);else if(i==s.size()){sum += root->v;for(int j = 0; j < 26; ++j){if(root->next[j]){find(root->next[j], s, i, sum);}}}} }; class MapSum {trie* root; public:/** Initialize your data structure here. */MapSum() {root = new trie();}void insert(string key, int val) {root->insert(key,val);}int sum(string prefix) {int tot = 0;root->find(root, prefix, 0, tot);return tot;} };/*** Your MapSum object will be instantiated and called as such:* MapSum* obj = new MapSum();* obj->insert(key,val);* int param_2 = obj->sum(prefix);*/

總結(jié)

以上是生活随笔為你收集整理的LeetCode677. 键值映射(Trie树)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。