• [Swift]LeetCode208. 实现 Trie (前缀树) | Implement Trie (Prefix Tree)


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10187360.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Implement a trie with insertsearch, and startsWith methods.

    Example:

    Trie trie = new Trie();
    
    trie.insert("apple");
    trie.search("apple");   // returns true
    trie.search("app");     // returns false
    trie.startsWith("app"); // returns true
    trie.insert("app");   
    trie.search("app");     // returns true
    

    Note:

    • You may assume that all inputs are consist of lowercase letters a-z.
    • All inputs are guaranteed to be non-empty strings.

    实现一个 Trie (前缀树),包含 insertsearch, 和 startsWith 这三个操作。

    示例:

    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

    说明:

    • 你可以假设所有的输入都是由小写字母 a-z 构成的。
    • 保证所有输入均为非空字符串。

    424ms

     1 class Node {
     2     var wordEnd = false
     3     var next : [Character : Node] = [:]
     4 }
     5 
     6 class Trie {
     7     let root = Node()
     8     /** Initialize your data structure here. */
     9     init() {
    10         
    11     }
    12     
    13     /** Inserts a word into the trie. */
    14     func insert(_ word: String) {
    15       var currentNode = root
    16         for c in word {
    17             if let nextNode = currentNode.next[c] {
    18                 currentNode = nextNode
    19             } else {
    20                 let nextNode = Node()
    21                 currentNode.next[c] = nextNode
    22                 currentNode = nextNode
    23             }
    24         }
    25         currentNode.wordEnd = true
    26     }
    27     
    28     /** Returns if the word is in the trie. */
    29     func search(_ word: String) -> Bool {
    30       var currentNode = root
    31       for c in word {
    32           if let node = currentNode.next[c] {
    33               currentNode = node
    34           } else {
    35               return false
    36           }
    37       }
    38         return currentNode.wordEnd
    39     }
    40     
    41     /** Returns if there is any word in the trie that starts with the given prefix. */
    42     func startsWith(_ prefix: String) -> Bool {
    43       var currentNode = root
    44       for c in prefix {
    45           if let node = currentNode.next[c] {
    46               currentNode = node
    47           } else {
    48               return false
    49           }
    50       }
    51         return true
    52     }
    53 }
    54 
    55 /**
    56  * Your Trie object will be instantiated and called as such:
    57  * let obj = Trie()
    58  * obj.insert(word)
    59  * let ret_2: Bool = obj.search(word)
    60  * let ret_3: Bool = obj.startsWith(prefix)
    61  */
    62  

    432ms

     1 class Node {
     2     var ch: Character
     3     var children: [Node?]
     4     var isWord: Bool
     5     init () {
     6         self.ch = "*"
     7         self.children = Array(repeating: nil, count: 26)
     8         self.isWord = false
     9     }
    10         
    11     init (_ ch: Character) {
    12         self.ch = ch
    13         self.children = Array(repeating: nil, count: 26)
    14         self.isWord = false
    15     }
    16 }
    17 class Trie {
    18 
    19     private var root: Node
    20     /** Initialize your data structure here. */
    21     init() {
    22         root = Node()
    23     }
    24     
    25     /** Inserts a word into the trie. */
    26     func insert(_ word: String) {
    27         var cur = root
    28           for c in word {
    29               if let node = cur.children[c.toValue - 97] {
    30                   cur = node
    31               }
    32               else {
    33                   let node = Node(c)
    34                   cur.children[c.toValue - 97] = node
    35                   cur = node
    36               }
    37           }
    38         cur.isWord = true
    39         
    40     }
    41     
    42     /** Returns if the word is in the trie. */
    43     func search(_ word: String) -> Bool {
    44         var cur = root
    45           for c in word {
    46               if let node = cur.children[c.toValue - 97] {
    47                   cur = node
    48               }
    49               else {
    50                   return false
    51               }
    52           }
    53         return cur.isWord == true   
    54     }
    55     
    56     /** Returns if there is any word in the trie that starts with the given prefix. */
    57     func startsWith(_ prefix: String) -> Bool {
    58               var cur = root
    59           for c in prefix {
    60               if let node = cur.children[c.toValue - 97] {
    61                   cur = node
    62               }
    63               else {
    64                   return false
    65               }
    66           }
    67         return  true    
    68     }
    69 }
    70 extension Character {
    71     var toValue: Int {
    72         let characterString = String(self)
    73         let scalars = characterString.unicodeScalars
    74 
    75         return Int(scalars[scalars.startIndex].value)
    76     }
    77 }
    78 /**
    79  * Your Trie object will be instantiated and called as such:
    80  * let obj = Trie()
    81  * obj.insert(word)
    82  * let ret_2: Bool = obj.search(word)
    83  * let ret_3: Bool = obj.startsWith(prefix)
    84  */
    85  

    436ms

     1 class Trie {
     2 
     3     class TrieNode {
     4         let val: Character
     5         var childs = [Character: TrieNode]()
     6         
     7         init(_ val: Character) {
     8             self.val = val
     9         }
    10     }
    11     
    12     let trie = TrieNode("0")
    13     
    14     /** Initialize your data structure here. */
    15     init() {
    16         
    17     }
    18     
    19     /** Inserts a word into the trie. */
    20     func insert(_ word: String) {
    21         var current = trie
    22         for c in word+"#" {
    23             if let child = current.childs[c] {
    24                 current = child
    25             } else {
    26                 let new = TrieNode(c)
    27                 current.childs[c] = new
    28                 current = new
    29             }
    30         }
    31     }
    32     
    33     /** Returns if the word is in the trie. */
    34     func search(_ word: String) -> Bool {
    35         var current = trie
    36         for c in word+"#" {
    37             if let child = current.childs[c] {
    38                 current = child
    39             } else {
    40                 return false
    41             }
    42         }
    43       
    44         return current.childs.isEmpty
    45     }
    46     
    47     /** Returns if there is any word in the trie that starts with the given prefix. */
    48     func startsWith(_ prefix: String) -> Bool {
    49       var current = trie
    50         for c in prefix {
    51             if let child = current.childs[c] {
    52                 current = child
    53             } else {
    54                 return false
    55             }
    56         }
    57       
    58         return true
    59     }
    60 }
    61 
    62 /**
    63  * Your Trie object will be instantiated and called as such:
    64  * let obj = Trie()
    65  * obj.insert(word)
    66  * let ret_2: Bool = obj.search(word)
    67  * let ret_3: Bool = obj.startsWith(prefix)
    68  */
    69  

    452ms

     1 class TrieNode
     2 {
     3     var child:[TrieNode?]
     4     var isWord:Bool = false
     5     init()
     6     {
     7         child = [TrieNode?](repeating:nil,count:26)
     8     }
     9 }
    10 
    11 
    12 class Trie {
    13     var root:TrieNode?
    14 
    15     /** Initialize your data structure here. */
    16     init() {
    17         root = TrieNode()
    18     }
    19     
    20     /** Inserts a word into the trie. */
    21     func insert(_ word: String) {
    22         var p:TrieNode? = root
    23         for a in word.characters
    24         {
    25             var i:Int = a.ascii - 97
    26             if p!.child[i] == nil
    27             {
    28                 p!.child[i] = TrieNode()
    29             }
    30             p = p!.child[i]
    31         }
    32         p!.isWord = true
    33     }
    34     
    35     /** Returns if the word is in the trie. */
    36     func search(_ word: String) -> Bool {
    37         var p:TrieNode? = root
    38         for a in word.characters
    39         {
    40             var i:Int = a.ascii - 97
    41             if p?.child[i] == nil
    42             {
    43                return false
    44             }
    45             p = p!.child[i]
    46         }
    47         return p!.isWord
    48     }
    49     
    50     /** Returns if there is any word in the trie that starts with the given prefix. */
    51     func startsWith(_ prefix: String) -> Bool {
    52         var p:TrieNode? = root
    53         for a in prefix.characters
    54         {
    55             var i:Int = a.ascii - 97
    56             if p?.child[i] == nil
    57             {
    58                return false
    59             }
    60             p = p!.child[i]
    61         }
    62         return true
    63     }
    64 }
    65 
    66 //Character扩展方法  
    67 extension Character  
    68 {  
    69   //属性:ASCII整数值(定义小写为整数值)
    70    var ascii: Int {
    71         get {
    72             let s = String(self).unicodeScalars
    73             return Int(s[s.startIndex].value)
    74         }
    75     }
    76 }
    77 /**
    78  * Your Trie object will be instantiated and called as such:
    79  * let obj = Trie()
    80  * obj.insert(word)
    81  * let ret_2: Bool = obj.search(word)
    82  * let ret_3: Bool = obj.startsWith(prefix)
    83  */
    84  

    460ms

     1 class Trie {
     2     /** Initialize your data structure here. */
     3     init() {
     4         
     5     }
     6     
     7     /** Inserts a word into the trie. */
     8     func insert(_ word: String) {
     9         var root = self.root
    10         
    11         let unicodeScalars = Array(word.utf8)
    12         
    13         for character in unicodeScalars {
    14             let ascii = Int(character - 97)
    15             
    16             if root.children[ascii] == nil {
    17                 
    18                 root.children[ascii] = TrieNode(String(character))
    19             }
    20             
    21             root = root.children[ascii]!
    22         }
    23         root.isEnd = true
    24     }
    25     
    26     /** Returns if the word is in the trie. */
    27     func search(_ word: String) -> Bool {
    28         var root = self.root
    29         
    30         let unicodeScalars = Array(word.utf8)
    31         
    32         for character in unicodeScalars {
    33             let ascii = Int(character - 97)
    34             
    35             guard let node = root.children[ascii] else {
    36                 return false
    37             }
    38             root = node
    39         }
    40         
    41         return root.isEnd
    42     }
    43     
    44     /** Returns if there is any word in the trie that starts with the given prefix. */
    45     func startsWith(_ prefix: String) -> Bool {
    46         var root = self.root
    47         
    48         let unicodeScalars = Array(prefix.utf8)
    49         
    50         for character in unicodeScalars {
    51             let ascii = Int(character - 97)
    52             
    53             guard let node = root.children[ascii] else {
    54                 return false
    55             }
    56             root = node
    57         }
    58         
    59         return true
    60     }
    61     
    62     var root = TrieNode("")
    63     
    64 }
    65 
    66 class TrieNode {
    67     
    68     init(_ value: String) {
    69         self.value = value
    70     }
    71     
    72     var value : String
    73     
    74     
    75     var isEnd = false
    76     
    77     var children : [TrieNode?] = Array(repeating: nil, count: 26)
    78     
    79 }
    80 
    81 /**
    82  * Your Trie object will be instantiated and called as such:
    83  * let obj = Trie()
    84  * obj.insert(word)
    85  * let ret_2: Bool = obj.search(word)
    86  * let ret_3: Bool = obj.startsWith(prefix)
    87  */
    88  
  • 相关阅读:
    VSCode 代码格式化 快捷键
    mac电脑如何更换硬盘
    await和$nextTick的使用
    Luckysheet 在线电子表格
    FreeFileSync 开源文件夹同步备份软件工具
    一个好评如潮的UI框架,Quasar Framework
    饿了么是阿里巴巴旗下的么?
    JSON Web Token 入门教程
    “怪胎”便利蜂
    【源码】Flink StreamGraph 生成过程
  • 原文地址:https://www.cnblogs.com/strengthen/p/10187360.html
Copyright © 2020-2023  润新知