字典树的实现

题目描述

字典树又称为前缀树或者Trie树,是处理字符串常用的数据结构。假设组成所有单词的字符仅是‘a’~‘z’,请实现字典树的结构,并包含以下四个主要的功能。void insert(String word):添加word,可重复添加;void delete(String word):删除word,如果word添加过多次,仅删除一次;boolean search(String word):查询word是否在字典树中出现过(完整的出现过,前缀式不算);int prefixNumber(String pre):返回以字符串pre作为前缀的单词数量。现在给定一个m,表示有m次操作,每次操作都为以上四种操作之一。每次操作会给定一个整数op和一个字符串word,op代表一个操作码,如果op为1,则代表添加word,op为2则代表删除word,op为3则代表查询word是否在字典树中,op为4代表返回以word为前缀的单词数量(数据保证不会删除不存在的word)。

对于每次操作,如果op为3时,如果word在字典树中,请输出“YES”,否则输出“NO”;如果op为4时,请输出返回以word为前缀的单词数量,其它情况不输出。
示例1
输入:
[[“1”,“qwer”],[“1”,“qwe”],[“3”,“qwer”],[“4”,“q”],[“2”,“qwer”],[“3”,“qwer”],[“4”,“q”]]

返回值:
[“YES”,“2”,“NO”,“1”]

代码
import java.util.*;
public class Solution {
  private static String YES = "YES";
  private static String NO = "NO";
  private Map<String,Integer> wordsMap = new HashMap<>();
  // 添加word
  private void insert(String word){
      if (word.length() == 0){
          return;
      }
      // 添入map中
      if (wordsMap.containsKey(word)){
          wordsMap.put(word,wordsMap.get(word)+1);
      }else{
          wordsMap.put(word,1);
      }
  }
  // 删除word,word在前缀树中是必然存在的
  private void delete(String word){
     if (wordsMap.containsKey(word)){
         wordsMap.put(word,wordsMap.get(word)-1);
     }
  }
  // 查询word是否在字典树中出现过
  private boolean search(String word){
      if (wordsMap.containsKey(word)){
          return wordsMap.get(word) != 0;
      }
      return false;
  }
  // 返回以字符串pre作为前缀的单词数量
  private int prefixNumber(String pre){
      int res = 0;
      for(String key : wordsMap.keySet()){
          if (key.startsWith(pre)){
               res = res + wordsMap.get(key);
          }
      }
      return res;
  }
  /**
   * 
   * @param operators string字符串二维数组 the ops
   * @return string字符串一维数组
   */
  public String[] trieU (String[][] operators) {
      // write code here
      List<String> res = new ArrayList<>();
      for(int i = 0;i < operators.length;++i){
          switch(operators[i][0]){
              // 插入
              case "1":
                  insert(operators[i][1]);
                  break;
              // 删除
              case "2":
                  delete(operators[i][1]);
                  break;
              // 查找单词
              case "3":
                  if (search(operators[i][1])){
                      res.add(YES);
                  }else{
                      res.add(NO);
                  }
                  break;
              // 查找前缀
              case "4":
                  res.add(String.valueOf(prefixNumber(operators[i][1])));
                  break;
          }
      }
      String[] anw = new String[res.size()];
      for (int i = 0;i < anw.length;++i){
          anw[i] = res.get(i);
      }
      return anw;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值