典型的矩陣搜索問題
深度優先搜索(DFS)+ 剪枝
spa
本問題是典型的矩陣搜索問題,可以使用 深度優先搜索(DFS)+ 剪枝 解決。
像是在暴力破解
一、遍歷矩陣,找到相同的字符,
二、從這個字符開始遞歸上下左右的字符,出界和與word[k+1]不等則返回false;
三、若與word[k+1]相同,且k是最後一個字符,就表示遞歸結束且有符合條件的字符串,返回true。
四、若與word[k+1]相同,但不是最後一個字符,就表示須要遞歸,這裏比較暴力了,
上下左右有一個符合的,就繼續遞歸下去,沒有符合的就中斷並返回false。從矩陣的下一個字符從新找與word的第一個字符相同的。這裏還有一個重點!!:矩陣中的字符只能用一次,因此須要將判斷相同的字符置爲空格字符'\0'(也就是不能走回頭路,若是下一個字母和上一個字母相同的話,以前那個不爲空,就會搜索到回頭路了),那麼若是這條路走不通,即第四步其中一個循環返回了false,就須要恢復成原樣,返回上一個節點,繼續其餘方向的循環搜索。
只要有一條路true了,就返回true,全部的路都走不通了等循環結束了才返回false。code
class Solution { public boolean exist(char[][] board, String word) { char[] words = word.toCharArray(); for(int i = 0; i < board.length; i++) { for(int j = 0; j < board[0].length; j++) { if(dfs(board, words, i, j, 0)) return true; } } return false; } boolean dfs(char[][] board, char[] word, int i, int j, int k) { if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word[k]) return false; if(k == word.length - 1) return true; board[i][j] = '\0'; boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) || dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1); board[i][j] = word[k]; return res; } }