<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      字典樹(Trie)

      在這里插入圖片描述
      在這里插入圖片描述
      在這里插入圖片描述
      Trie最大的問題:空間!所以可以使用一下解決方案。
      在這里插入圖片描述
      在這里插入圖片描述

      Code

      #pragma once
      
      #include <map>
      
      class Node {
      public:
          explicit Node() noexcept: isWord(false) {}
      
          explicit Node(bool isWord) : isWord(isWord), next() {}
      
      public:
          bool isWord;
          std::map<char, Node> next;
      };
      
      class Trie {
      public:
          explicit Trie() : size(0) {
              root = new Node();
          }
      
          ~Trie() noexcept {
              delete root;
              root = nullptr;
          }
      
          constexpr int getSize() const noexcept {
              return size;
          }
      
          void add(const std::string &word) {
              Node *cur = root;
              for (int i = 0; i < word.length(); ++i) {
                  const char c = word.at(i);
                  if (cur->next.find(c) == cur->next.end()) {     //如果找不到字母,就說明這個字母還沒添加
                      cur->next.insert(std::pair<char, Node>(c, Node()));
                  }
                  cur = &cur->next.find(c)->second;
              }
      
              if (!cur->isWord) { //如果以前不表示單詞的結(jié)尾,否側(cè)添加重復(fù)
                  cur->isWord = true;
                  size++;
              }
          }
      
          bool contains(const std::string &word) {
              const Node *cur = root;
              for (int i = 0; i < word.length(); ++i) {
                  const char c = word.at(i);
                  if (cur->next.find(c) == cur->next.end()) { //如果其中字母找不到,就說明單詞不匹配直接看返回
                      return false;
                  }
                  cur = &cur->next.find(c)->second;
              }
              return cur->isWord; //如果是 int interesting 類似的前綴, 所以返回記錄是否為字母結(jié)尾的成員變量
          }
      
          //查詢單詞是否為前綴
          bool isPrefix(const std::string &prefix) {
              const Node *cur = root;
              for (int i = 0; i < prefix.length(); ++i) {
                  const char c = prefix.at(i);
                  if (cur->next.find(c) == cur->next.end()) {
                      return false;
                  }
                  cur = &cur->next.find(c)->second;
              }
              return true;
          }
      
      private:
          Node *root;
          int size;
      };
      

      LeetCode

      208. 實(shí)現(xiàn) Trie (前綴樹)

      class Trie {
      public:
          /** Initialize your data structure here. */
          Trie() {
              root = new Node();
          }
          
          /** Inserts a word into the trie. */
          void insert(string word) {
              Node *cur = root;
              for (int i = 0; i < word.size(); ++i) {
                  char c = word.at(i);
                  if (cur->next.find(c) == cur->next.end()) {
                      cur->next.insert(std::pair<char, Node>(c, Node()));
                  }
                  cur = &cur->next.find(c)->second;
              }
      
              if (!cur->isWord) {
                  cur->isWord = true;
              }
          }
          
          /** Returns if the word is in the trie. */
          bool search(string word) {
              Node *cur = root;
              for (int i = 0; i < word.size(); ++i) {
                  char c = word.at(i);
                  if (cur->next.find(c) == cur->next.end()) {
                      return false;
                  }
                  cur = &cur->next.find(c)->second;
              }
              return cur->isWord;
          }
          
          /** Returns if there is any word in the trie that starts with the given prefix. */
          bool startsWith(string prefix) {
              Node *cur = root;
              for (int i = 0; i < prefix.size(); ++i) {
                  char c = prefix.at(i);
                  if (cur->next.find(c) == cur->next.end()) {
                      return false;
                  }
                  cur = &cur->next.find(c)->second;
              }
              return true;
          }
      private:
          class Node {
          public:
              bool isWord;
              std::map<char, Node> next;
      
              Node() {
                  isWord = false;
              }
          };
      
          Node *root;
      };
      

      211. 添加與搜索單詞 - 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

      class WordDictionary {
      public:
          /** Initialize your data structure here. */
          WordDictionary() {
              root = new Node();
          }
          
          /** Adds a word into the data structure. */
          void addWord(string word) {
              Node *cur = root;
              for (int i = 0; i < word.size(); ++i) {
                  char c = word.at(i);
                  if (cur->next.find(c) == cur->next.end()) {
                      cur->next.insert(std::pair<char, Node>(c, Node()));
                  }
                  cur = &cur->next.find(c)->second;
              }
              cur->isWord = true;
          }
          
          /** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
          bool search(string word) {
              return match(root, word, 0);
          }
      private:
          class Node {
          public:
              bool isWord;
              std::map<char, Node> next;
      
              Node() {
                  isWord = false;
              }
          };
      
          Node *root;
          
          bool match(Node *node, string word, int index) {
          	if (index == word.size()) {
          		return node->isWord;
          	}
          	char c = word.at(index);
          	if (c != '.') {
          		if (node->next.find(c) == node->next.end()) {
                      return false;
                  }
                  return match(&node->next.find(c)->second, word, index + 1);
          	} else {
          		for(std::map<char, Node>::iterator iterator= node->next.begin();iterator != node->next.end();iterator++) {
                   	if(match(&node->next.find(iterator->first)->second, word, index + 1)) {
                   		return true;
                   	}   
                  }
                  return false;
          	}    	
          }
      };
      

      677. 鍵值映射

      class MapSum {
      public:
          /** Initialize your data structure here. */
          MapSum() {
              root = new Node();
          }
          
          void insert(string key, int val) {
              Node *cur = root;
              for (int i = 0; i < key.size(); ++i) {
                  char c = key.at(i);
                  if (cur->next.find(c) == cur->next.end()) {
                      cur->next.insert(std::pair<char, Node>(c, Node()));
                  }
                  cur = &cur->next.find(c)->second;
              }
              cur->value = val;
          }
          
          int sum(string prefix) {
              Node *cur = root;
              for (int i = 0; i < prefix.size(); i++) {
              	char c = prefix.at(i);
              	if (cur->next.find(c) == cur->next.end()) {
              		return 0;
              	}
              	cur = &cur->next.find(c)->second;
              }
              return sum(cur);
          }
      private:
          class Node {
          public:
              int value;
              std::map<char, Node> next;
      
              Node() {
                  value = 0;
              }
          };
      
          Node *root;
          
          int sum(Node *node) {
          	int res = node->value;
          	for(std::map<char, Node>::iterator iterator= node->next.begin();iterator != node->next.end();iterator++){
              	res += sum(&node->next.find(iterator->first)->second);  
              }
              return res;
          }
      };
      
      posted @ 2022-07-07 16:57  放飛夢想C  閱讀(30)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 野花香视频在线观看免费高清版| japanese无码中文字幕| 国产亚洲欧美另类一区二区| 在线看无码的免费网站| 东方四虎av在线观看| 欧美嫩交一区二区三区| 国产精品青青在线观看爽香蕉| 少妇xxxxx性开放| 狠狠色综合久久丁香婷婷| 精品国产线拍大陆久久尤物| 国产成人综合色就色综合 | 三级国产三级在线| 91久久国产成人免费观看| 九九热精品视频免费在线| 中文字幕 日韩 人妻 无码| 亚洲自在精品网久久一区| 久久精品亚洲国产成人av| 色噜噜狠狠成人综合| а∨天堂一区中文字幕| 日本一码二码三码的区分| 亚洲av免费成人在线| 亚洲欧洲日产国码AV天堂偷窥| 国产亚洲av日韩精品熟女| 久久一本人碰碰人碰| 国产精品人成视频免费播放| 亚洲日韩成人av无码网站| 中文字幕国产精品第一页| 亚洲一区二区精品动漫| 国产一区二区在线影院| 日韩精品一区二区三区vr| 这里只有精品免费视频| 国产一区二区三区九精品| 亚洲精品日韩精品久久| 亚洲区一区二区激情文学| 人人爽人人澡人人人妻| 亚洲欧美高清在线精品一区二区| 免费专区丝袜调教视频| 亚洲美女厕所偷拍美女尿尿| 亚洲熟女乱色一区二区三区| 欧美日韩亚洲国产| 无码熟妇人妻av影音先锋|