Advertisement
HXXXXJ

212. Word Search II

Jan 30th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.34 KB | None | 0 0
  1. class Trie {
  2.     var root = Node()
  3.     func addWord( _ str: String){
  4.         var runner = root
  5.         for char in str{
  6.             if let childN = runner.child[char]{
  7.                 runner = childN
  8.             }else{
  9.                 runner.child[char] = Node()
  10.                 runner = runner.child[char]!
  11.             }
  12.         }
  13.         runner.hasWord = true
  14.     }
  15.     func hasPrefix(_ pre: String) -> Bool{
  16.         var runner = root
  17.         for char in pre{
  18.             if let childN = runner.child[char]{
  19.                 runner = childN
  20.             }else{
  21.                return false
  22.             }
  23.         }
  24.         return true
  25.     }
  26.     func hasWord(_ word : String) -> Bool{
  27.         var runner = root
  28.         for char in word{
  29.             if let childN = runner.child[char]{
  30.                 runner = childN
  31.             }else{
  32.                return false
  33.             }
  34.         }
  35.         return runner.hasWord
  36.     }
  37. }
  38.  
  39. class Node{
  40.     var child = [Character : Node]()
  41.     var hasWord = false
  42. }
  43.  
  44. class Solution {
  45.     func findWords(_ b: [[Character]], _ words: [String]) -> [String] {
  46.         var ans = [String]()
  47.         var trie = Trie()
  48.         for w in words {
  49.             trie.addWord(w)
  50.         }
  51.         var visited = [[Bool]](repeating : [Bool](repeating: false, count: b[0].count ), count : b.count)
  52.         for i in 0 ..< b.count{
  53.             for j in 0 ..< b[0].count{
  54.                 var list = ""
  55.                 dfs(b,i, j, &ans, trie, &list, &visited)
  56.             }
  57.         }
  58.         return ans
  59.     }
  60.    
  61.     let dx = [0,0,1,-1]
  62.     let dy = [1,-1,0,0]
  63.     func dfs(_ b: [[Character]], _ x: Int, _ y :Int, _ ans: inout [String], _ trie: Trie, _ list: inout String, _ visited :inout [[Bool]]){
  64.         list.append(b[x][y])
  65.        
  66.         if !trie.hasPrefix(list) {
  67.             list.removeLast()
  68.             return
  69.         }
  70.         if trie.hasWord(list) && !ans.contains(list){
  71.             ans.append(list)
  72.         }
  73.         visited[x][y] = true
  74.         for i in 0 ..< 4{
  75.             let nx = dx[i] + x
  76.             let ny = dy[i] + y
  77.             if nx >= 0 && ny >= 0 && ny < b[0].count && nx < b.count && !visited[nx][ny]{
  78.                 dfs(b,nx, ny, &ans, trie, &list, &visited)
  79.                
  80.             }
  81.         }
  82.         list.removeLast()
  83.         visited[x][y] = false
  84.     }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement