[Swift]LeetCode79. 單詞搜尋 | Word Search
阿新 • • 發佈:2018-11-09
Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
Example:
board = [ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ] Given word = "ABCCED", return true. Given word = "SEE", return true. Given word = "ABCB", return false.
給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。
示例:
board = [ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ] 給定 word = "ABCCED", 返回 true. 給定 word = "SEE", 返回 true. 給定 word = "ABCB", 返回 false.
100ms
1 class Solution {2 3 func searchSolution(_ board: inout [[Character]], 4 _ letter: inout [Character], 5 _ visited: inout [[Bool]], 6 _ x: Int, 7 _ y: Int, 8 _ index: Int) -> Bool {9 10 if board[x][y] == letter[index] { 11 12 visited[x][y] = true 13 14 if (index + 1) >= letter.count { 15 return true 16 } 17 18 if x > 0 { 19 if visited[x-1][y] == false && searchSolution(&board, &letter, &visited, x - 1, y, index + 1) { 20 return true 21 } 22 } 23 if x < (board.count - 1) { 24 if visited[x+1][y] == false && searchSolution(&board, &letter, &visited, x + 1, y, index + 1) { 25 return true 26 } 27 } 28 if y > 0 { 29 if visited[x][y-1] == false && searchSolution(&board, &letter, &visited, x, y - 1, index + 1) { 30 return true 31 } 32 } 33 if y < (board[0].count - 1) { 34 if visited[x][y+1] == false && searchSolution(&board, &letter, &visited, x, y + 1, index + 1) { 35 return true 36 } 37 } 38 39 visited[x][y] = false 40 41 } 42 43 return false 44 } 45 46 func exist(_ board: [[Character]], _ word: String) -> Bool { 47 48 var letters = Array(word) 49 var board = board 50 51 if board.count <= 0 { return false } 52 if board[0].count <= 0 { return false } 53 54 var visited = [[Bool]](repeating: [Bool](repeating: false, count: board[0].count), count: board.count) 55 56 for x in 0..<board.count { 57 for y in 0..<board[0].count { 58 59 if searchSolution(&board, &letters, &visited, x, y, 0) { 60 return true 61 } 62 } 63 } 64 65 return false 66 } 67 }
128ms
1 class Solution { 2 func exist(_ board: [[Character]], _ word: String) -> Bool { 3 4 if board.count == 0 { 5 return false 6 } 7 let m = board.count 8 let n = board[0].count 9 var board = board 10 var wordChars = Array(word) 11 for i in 0..<m { 12 for j in 0..<n { 13 if helper(&board, i, j, &wordChars, 0) { 14 return true 15 } 16 } 17 } 18 return false 19 20 } 21 22 func helper(_ board: inout [[Character]], _ i: Int, _ j: Int, _ wordChars: inout [Character], _ cur: Int) -> Bool { 23 let m = board.count 24 let n = board[0].count 25 if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] == "0" || board[i][j] != wordChars[cur]) { 26 return false 27 } 28 if cur == wordChars.count - 1 { 29 return true 30 } 31 let temp = board[i][j] 32 board[i][j] = "0" 33 let res = helper(&board, i-1, j, &wordChars, cur+1) || 34 helper(&board, i+1, j, &wordChars, cur+1) || 35 helper(&board, i, j-1, &wordChars, cur+1) || 36 helper(&board, i, j+1, &wordChars, cur+1) 37 board[i][j] = temp 38 return res 39 } 40 }
168ms
1 class Solution { 2 func exist(_ board: [[Character]], _ word: String) -> Bool { 3 4 let char = word[word.index(word.startIndex, offsetBy: 0)] 5 6 for row in 0..<board.count { 7 for col in 0..<board[0].count { 8 if board[row][col] == char && search(board, word, row, col, 1) { 9 return true 10 } 11 } 12 } 13 14 return false 15 } 16 17 func search(_ board: [[Character]], _ word: String, _ row: Int, _ col: Int, _ index: Int) -> Bool { 18 if index >= word.count { return true } 19 20 var board = board 21 board[row][col] = "-" 22 23 let char = word[word.index(word.startIndex, offsetBy: index)] 24 25 if (row+1) < board.count && board[row+1][col] == char && search(board, word, row+1, col, index+1) { 26 return true 27 } 28 29 else if row > 0 && board[row-1][col] == char && search(board, word, row-1, col, index+1) { 30 return true 31 } 32 33 else if (col+1) < board[row].count && board[row][col+1] == char && search(board, word, row, col+1, index+1) { 34 return true 35 } 36 37 else if col > 0 && board[row][col-1] == char && search(board, word, row, col-1, index+1) { 38 return true 39 } 40 41 return false 42 } 43 }
172ms
1 class Solution { 2 func exist(_ board: [[Character]], _ word: String) -> Bool { 3 var board = board 4 var word = Array(word) 5 for y in stride(from:0,to:board.count,by:1) { 6 for x in stride(from:0,to:board[0].count,by:1) { 7 if dfs(&board,y,x,word,0) { 8 return true 9 } 10 } 11 } 12 return false 13 } 14 15 func dfs(_ board:inout[[Character]], _ y:Int,_ x:Int,_ word:Array<Character>,_ wordPos:Int) -> Bool { 16 if wordPos == word.count { 17 return true 18 } else if y < 0 || y >= board.count || x < 0 || x >= board[0].count || board[y][x] != word[wordPos]{ 19 return false 20 } 21 let temp = board[y][x] 22 board[y][x] = "#" 23 let res = dfs(&board,y + 1,x,word,wordPos + 1) || 24 dfs(&board,y - 1,x,word,wordPos + 1) || 25 dfs(&board,y,x + 1,word,wordPos + 1) || 26 dfs(&board,y,x - 1,word,wordPos + 1) 27 28 board[y][x] = temp 29 return res 30 } 31 }
192ms
1 class Solution { 2 let rowDirection = [0,0,1,-1] 3 let colDiriction = [1,-1,0,0] 4 5 func exist(_ board: [[Character]], _ word: String) -> Bool { 6 guard !board.isEmpty else { 7 return false 8 } 9 10 let rowCount = board.count 11 let colCount = board[0].count 12 13 if rowCount * colCount < word.count { 14 return false 15 } 16 17 var wordChars = [Character](word) 18 19 var tempBoard = board 20 21 for rowIndex in 0..<rowCount { 22 for colIndex in 0..<colCount { 23 var temp = tempBoard[rowIndex][colIndex] 24 if temp == wordChars[0] { 25 tempBoard[rowIndex][colIndex] = "0" 26 if existHelper(&tempBoard, 1, &wordChars, rowIndex, colIndex, 1, rowCount, colCount) { 27 return true 28 } 29 tempBoard[rowIndex][colIndex] = temp 30 } 31 } 32 } 33 34 return false 35 } 36 37 func existHelper (_ board: inout [[Character]], _ count: Int, _ word: inout [Character], _ rowIndex: Int, _ colIndex: Int, _ index: Int, _ rowCount: Int, _ colCount: Int) -> Bool { 38 39 40 if count == word.count { 41 return true 42 } 43 let newCount = count + 1 44 for i in 0..<rowDirection.count { 45 let newRow = rowIndex + rowDirection[i] 46 let newCol = colIndex + colDiriction[i] 47 48 49 50 if newRow < 0 || newRow >= rowCount 51 || newCol < 0 || newCol >= colCount 52 || board[newRow][newCol] == "0" || board[newRow][newCol] != word[index] { 53 continue 54 } 55 56 let newStr = board[newRow][newCol] 57 board[newRow][newCol] = "0" 58 59 if existHelper(&board, newCount, &word, newRow, newCol, index+1, rowCount, colCount) { 60 return true 61 } 62 63 board[newRow][newCol] = newStr 64 } 65 66 return false 67 } 68 }
316ms
1 class Solution { 2 func exist(_ board: [[Character]], _ word: String) -> Bool { 3 if board.count == 0 { 4 return false 5 } 6 var visit = Array.init(repeating: Array.init(repeating: false, count: board[0].count), count: board.count) 7 for i in 0..<board.count { 8 for j in 0..<board[0].count { 9 if exist(board, word, 0, i, j, &visit) { 10 return true 11 } 12 } 13 } 14 return false 15 16 } 17 func exist(_ board: [[Character]], _ word: String,_ index: Int, _ i: Int,_ j: Int, _ visit:inout [[Bool]]) -> Bool { 18 if index == word.count {//已經到字串最後 19 return true 20 } 21 if i < 0 || j < 0 || i >= board.count || j >= board[0].count {//越界了 22 return false 23 } 24 if visit[i][j] {//訪問過了 25 return false 26 } 27 if board[i][j] != word[word.index(word.startIndex, offsetBy: index)] { 28 return false 29 } 30 //該字元符合條件,搜尋下一個字元 31 visit[i][j] = true 32 let result = exist(board, word, index + 1, i + 1, j, &visit) || exist(board, word, index + 1, i - 1, j, &visit) || exist(board, word, index + 1, i , j - 1, &visit) || exist(board, word, index + 1, i , j + 1, &visit) 33 visit[i][j] = false 34 return result 35 } 36 }