Advertisement
HXXXXJ

648. Replace Words

Apr 13th, 2019
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.26 KB | None | 0 0
  1. class Solution {
  2.     func replaceWords(_ dict: [String], _ sentence: String) -> String {
  3.         let trie = Trie()
  4.         for w in dict {
  5.             trie.addWord(w)
  6.         }
  7.         let arr = sentence.split(separator: " ")
  8.         var res = [String]()
  9.         for word in arr{
  10.             let charArr = Array(word)
  11.             var found = false
  12.             for i in 1 ... charArr.count{
  13.                 if trie.hasPrefix(String(charArr[0 ..< i])){
  14.                     if trie.hasWord(String(charArr[0 ..< i])){
  15.                        res.append(String(charArr[0 ..< i]))
  16.                         found = true
  17.                         break
  18.                     }
  19.                 }else{
  20.                     break
  21.                 }
  22.             }
  23.             if !found {
  24.                 res.append(String(word))
  25.             }
  26.         }
  27.        
  28.         return res.joined(separator: " ")
  29.     }
  30.    
  31.    
  32.     class Trie {
  33.         var root : Node
  34.         init(){
  35.             root = Node()
  36.         }
  37.        
  38.         func addWord(_ word : String){
  39.             var runner = root
  40.             for char in word{
  41.                 if let next = runner.children[char]{
  42.                     runner = next
  43.                 }else {
  44.                     let next = Node()
  45.                     runner.children[char] = next
  46.                     runner = next
  47.                 }
  48.             }
  49.             runner.hasWord = true
  50.         }
  51.         func hasPrefix(_ pre:String) -> Bool{
  52.             var runner = root
  53.             for char in pre{
  54.                 if let next = runner.children[char]{
  55.                     runner = next
  56.                 }else {
  57.                    return false
  58.                 }
  59.             }
  60.             return true
  61.         }
  62.         func hasWord(_ w:String) -> Bool{
  63.             var runner = root
  64.             for char in w{
  65.                 if let next = runner.children[char]{
  66.                     runner = next
  67.                 }else {
  68.                    return false
  69.                 }
  70.             }
  71.             return runner.hasWord
  72.         }
  73.     }
  74.     class Node{
  75.         var children : [Character : Node]
  76.         var hasWord : Bool
  77.         init(){
  78.             children = [Character : Node]()
  79.             hasWord = false
  80.         }
  81.     }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement