剑指OfferII062.实现前缀树

题目

Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。

这一数据结构有相当多的应用情景,例如自动补完和拼写检查。

请你实现 Trie 类:

Trie() 初始化前缀树对象。

void insert(String word) 向前缀树中插入字符串 word 。

boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。

boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。

示例:输入inputs = ["Trie", "insert", "search", "search", "startsWith", "insert", "search"]

inputs = [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]

输出[null, null, true, false, true, null, true]

解释 Trie trie = new Trie();

trie.insert("apple");

trie.search("apple"); // 返回 True

trie.search("app"); // 返回 False

trie.startsWith("app"); // 返回 True

trie.insert("app");

trie.search("app"); // 返回 True

提示:1 <= word.length, prefix.length <= 2000

word 和 prefix 仅由小写英文字母组成

insert、search 和 startsWith 调用次数 总计 不超过 3 * 104 次

注意:本题与主站 208 题相同:

解题思路分析

1、trie树;时间复杂度O(n),空间复杂度O(n)

剑指OfferII062.实现前缀树

剑指OfferII062.实现前缀树

type Trie struct {
   next   [26]*Trie
   ending int
}

func Constructor() Trie {
   return Trie{
      next:   [26]*Trie{},
      ending: 0,
   }
}

func (this *Trie) Insert(word string) {
   temp := this
   for _, v := range word {
      value := v - 'a'
      if temp.next[value] == nil {
         temp.next[value] = &Trie{
            next:   [26]*Trie{},
            ending: 0,
         }
      }
      temp = temp.next[value]
   }
   temp.ending++
}

func (this *Trie) Search(word string) bool {
   temp := this
   for _, v := range word {
      value := v - 'a'
      if temp = temp.next[value]; temp == nil {
         return false
      }
   }
   if temp.ending > 0 {
      return true
   }
   return false
}

func (this *Trie) StartsWith(prefix string) bool {
   temp := this
   for _, v := range prefix {
      value := v - 'a'
      if temp = temp.next[value]; temp == nil {
         return false
      }
   }
   return true
}

2、trie树;时间复杂度O(n),空间复杂度O(n)

type Trie struct {
   next   map[byte]*Trie
   ending int
}

/** Initialize your data structure here. */
func Constructor() Trie {
   return Trie{
      next:   make(map[byte]*Trie),
      ending: 0,
   }
}

/** Inserts a word into the trie. */
func (this *Trie) Insert(word string) {
   temp := this
   for _, v := range word {
      value := byte(v - 'a')
      if temp.next[value] == nil {
         temp.next[value] = &Trie{
            next:   make(map[byte]*Trie),
            ending: 0,
         }
      }
      temp = temp.next[value]
   }
   temp.ending++
}

/** Returns if the word is in the trie. */
func (this *Trie) Search(word string) bool {
   temp := this
   for _, v := range word {
      value := byte(v - 'a')
      if temp = temp.next[value]; temp == nil {
         return false
      }
   }
   if temp.ending > 0 {
      return true
   }
   return false
}

/** Returns if there is any word in the trie that starts with the given prefix. */
func (this *Trie) StartsWith(prefix string) bool {
   temp := this
   for _, v := range prefix {
      value := byte(v - 'a')
      if temp = temp.next[value]; temp == nil {
         return false
      }
   }
   return true
}

总结

Medium题目,题目同leetcode 208.实现Trie(前缀树)

展开阅读全文

页面更新:2024-03-13

标签:前缀   复杂度   高效   数据结构   示例   初始化   字符串   发音   情景   题目   类似   对象   提示   时间   数据   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top