力扣676.实现一个魔法字典

力扣676.实现一个魔法字典

  • 字典树 + dfs

cpp 复制代码
  class Trie
  {
      public:
      Trie* next[26];
      bool is_end = false;
  };
  class MagicDictionary {
  public:
      Trie* root = new Trie();
      
      void add(string& word)
      {
          Trie* p = root;
          for(char c:word)
          {
              if(p->next[c-'a'] == NULL) p->next[c-'a'] = new Trie();
              p = p->next[c-'a'];
          }
          p->is_end = true;
      }
      //idx为下标 , cnt为可以修改的字符数量 初始为1
      bool dfs(string& word,int idx,Trie* cur,int cnt)
      {
          //cnt必须为0,并且字符串必须结束
          if(idx == word.size()) return cnt == 0 && cur->is_end;
          for(int i=0;i<26;i++)
          {
              if(cur->next[i] == NULL) continue;
              //如果idx位匹配,继续下一个
              if(i == word[idx] - 'a')
              {
                  if(dfs(word,idx+1,cur->next[i],cnt)) return true;
              }
              //如果idx位不匹配,如果还能修改,就修改继续下一个
              else if(cnt>0 && dfs(word,idx+1,cur->next[i],cnt-1)) return true;
          }
          return false;
      }
      void buildDict(vector<string> dictionary) {
          for(string &word:dictionary)
              add(word);
      }
      
      bool search(string searchWord) {
          return dfs(searchWord,0,root,1);
      }
  };
相关推荐
AuroraWanderll3 分钟前
类和对象(三)-默认成员函数详解与运算符重载
c语言·开发语言·数据结构·c++·算法
Liangwei Lin11 分钟前
洛谷 P10471 最大异或对 The XOR Largest Pair
算法
sin_hielo12 分钟前
leetcode 3652(定长滑动窗口/前缀和)
数据结构·算法·leetcode
AI科技星13 分钟前
质量定义方程中条数概念的解析与经典例子计算
数据结构·人工智能·经验分享·算法·计算机视觉
啊阿狸不会拉杆13 分钟前
《数字图像处理》第8章-图像压缩和水印
图像处理·人工智能·算法·计算机视觉·数字图像处理
智航GIS14 分钟前
ArcGIS大师之路500技---034重采样算法选择
人工智能·算法·arcgis
子夜江寒14 分钟前
决策树与回归树简介:原理、实现与应用
算法·决策树·回归
TL滕18 分钟前
从0开始学算法——第十九天(并查集)
笔记·学习·算法
Swift社区20 分钟前
LeetCode 451 - 根据字符出现频率排序
算法·leetcode·ssh
JoannaJuanCV20 分钟前
自动驾驶—CARLA仿真(17)invertedai_traffic demo
人工智能·算法·自动驾驶·carla