diff --git a/solution/0000-0099/0079.Word Search/README.md b/solution/0000-0099/0079.Word Search/README.md index bcb3fbd7286f4..9845b8cdb013a 100644 --- a/solution/0000-0099/0079.Word Search/README.md +++ b/solution/0000-0099/0079.Word Search/README.md @@ -54,7 +54,7 @@ -深度优先搜索 DFS 实现。 +回溯(深度优先搜索 DFS )实现。 @@ -122,6 +122,47 @@ class Solution { } ``` +### **TypeScript** + +```ts +function exist(board: string[][], word: string): boolean { + let m = board.length, n = board[0].length; + let visited = Array.from({ length: m }, v => new Array(n).fill(false)); + for (let i = 0; i < m; ++i) { + for (let j = 0; j < n; ++j) { + if (dfs(board, word, i, j, 0, visited)) { + return true; + } + } + } + return false; +}; + +function dfs(board: string[][], word: string, i: number, j: number, depth: number, visited: boolean[][]): boolean { + let m = board.length, n = board[0].length; + if (i < 0 || i > m - 1 || j < 0 || j > n - 1 || visited[i][j]) { + return false; + } + if (board[i][j] != word.charAt(depth)) { + return false; + } + + if (depth == word.length - 1) { + return true; + } + + visited[i][j] = true; + ++depth; + let res = false; + for (let [dx, dy] of [[0, 1], [0, -1], [1, 0], [-1, 0]]) { + let x = i + dx, y = j + dy; + res = res || dfs(board, word, x, y, depth, visited); + } + visited[i][j] = false; + return res; +} +``` + ### **...** ``` diff --git a/solution/0000-0099/0079.Word Search/README_EN.md b/solution/0000-0099/0079.Word Search/README_EN.md index b4bb9e6e8ba3d..1f6e17afa1e02 100644 --- a/solution/0000-0099/0079.Word Search/README_EN.md +++ b/solution/0000-0099/0079.Word Search/README_EN.md @@ -109,6 +109,47 @@ class Solution { } ``` +### **TypeScript** + +```ts +function exist(board: string[][], word: string): boolean { + let m = board.length, n = board[0].length; + let visited = Array.from({ length: m }, v => new Array(n).fill(false)); + for (let i = 0; i < m; ++i) { + for (let j = 0; j < n; ++j) { + if (dfs(board, word, i, j, 0, visited)) { + return true; + } + } + } + return false; +}; + +function dfs(board: string[][], word: string, i: number, j: number, depth: number, visited: boolean[][]): boolean { + let m = board.length, n = board[0].length; + if (i < 0 || i > m - 1 || j < 0 || j > n - 1 || visited[i][j]) { + return false; + } + if (board[i][j] != word.charAt(depth)) { + return false; + } + + if (depth == word.length - 1) { + return true; + } + + visited[i][j] = true; + ++depth; + let res = false; + for (let [dx, dy] of [[0, 1], [0, -1], [1, 0], [-1, 0]]) { + let x = i + dx, y = j + dy; + res = res || dfs(board, word, x, y, depth, visited); + } + visited[i][j] = false; + return res; +} +``` + ### **...** ``` diff --git a/solution/0000-0099/0079.Word Search/Solution.ts b/solution/0000-0099/0079.Word Search/Solution.ts new file mode 100644 index 0000000000000..73912ca7155b3 --- /dev/null +++ b/solution/0000-0099/0079.Word Search/Solution.ts @@ -0,0 +1,36 @@ +function exist(board: string[][], word: string): boolean { + let m = board.length, n = board[0].length; + let visited = Array.from({ length: m }, v => new Array(n).fill(false)); + for (let i = 0; i < m; ++i) { + for (let j = 0; j < n; ++j) { + if (dfs(board, word, i, j, 0, visited)) { + return true; + } + } + } + return false; +}; + +function dfs(board: string[][], word: string, i: number, j: number, depth: number, visited: boolean[][]): boolean { + let m = board.length, n = board[0].length; + if (i < 0 || i > m - 1 || j < 0 || j > n - 1 || visited[i][j]) { + return false; + } + if (board[i][j] != word.charAt(depth)) { + return false; + } + + if (depth == word.length - 1) { + return true; + } + + visited[i][j] = true; + ++depth; + let res = false; + for (let [dx, dy] of [[0, 1], [0, -1], [1, 0], [-1, 0]]) { + let x = i + dx, y = j + dy; + res = res || dfs(board, word, x, y, depth, visited); + } + visited[i][j] = false; + return res; +} \ No newline at end of file