Advertisement
HXXXXJ

Airbnb - findTag

Mar 18th, 2019
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.27 KB | None | 0 0
  1.  
  2. func findTag(str: String, tags: [String: String]) -> String{
  3.     var res = ""
  4.     let trie = Trie()
  5.     for tag in tags.keys{
  6.         trie.addWord(tag)
  7.     }
  8.     var i = 0
  9.     var arr = Array(str)
  10.     while i < arr.count {
  11.         if trie.hasPrefix(String(arr[i]).lowercased()){
  12.             var j = i
  13.             while j < arr.count{
  14.                 if !trie.hasPrefix(String(arr[i ... j]).lowercased()){
  15.                     res.append(arr[i])
  16.                     i += 1
  17.                     break
  18.                 }
  19.                 if trie.hasWord(String(arr[i ... j]).lowercased()){
  20.                     res.append("[\(String(arr[i ... j])) : \(tags[String(arr[i ... j]).lowercased()]!)]")
  21.                     //arr.replaceSubrange(Range(NSMakeRange(i, j - i))!, with: tags[String(arr[i ... j])]!)
  22.                     i = j + 1
  23.                     break
  24.                 }
  25.                 j += 1
  26.             }
  27.         }else{
  28.             res.append(arr[i])
  29.             i += 1
  30.         }
  31.     }
  32.     return res
  33. }
  34.  
  35. class Trie {
  36.     var root = Node()
  37.     func addWord( _ str: String){
  38.         var runner = root
  39.         for char in str{
  40.             if let childN = runner.child[char]{
  41.                 runner = childN
  42.             }else{
  43.                 runner.child[char] = Node()
  44.                 runner = runner.child[char]!
  45.             }
  46.         }
  47.         runner.hasWord = true
  48.     }
  49.     func hasPrefix(_ pre: String) -> Bool{
  50.         var runner = root
  51.         for char in pre{
  52.             if let childN = runner.child[char]{
  53.                 runner = childN
  54.             }else{
  55.                 return false
  56.             }
  57.         }
  58.         return true
  59.     }
  60.     func hasWord(_ word : String) -> Bool{
  61.         var runner = root
  62.         for char in word{
  63.             if let childN = runner.child[char]{
  64.                 runner = childN
  65.             }else{
  66.                 return false
  67.             }
  68.         }
  69.         return runner.hasWord
  70.     }
  71. }
  72.  
  73. class Node{
  74.     var child = [Character : Node]()
  75.     var hasWord = false
  76. }
  77.  
  78.  
  79.  
  80. let tag =  ["airbnb": "business", "san francisco": "city"]
  81. let str = "I visited San Francisco for work and stayed at Airbnb. I really loved the city and the home where I stayed."
  82. let res = findTag(str: str, tags: tag)
  83. print(res)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement