题目
方法一:递归 +回溯
需要一个标记数组 来标志格子字符是否被使用过了 先找到word 的第一个字符在表格中的位置,再开始递归 递归的结束条件是如果word递归到了最后一个字符了,说明能在矩阵中找到单词 剪枝条件 就是如果已经找到单词了 res = true 了 后面就不需要递归了,还有如果下标越界、当前格子被使用过了、 或者当前格子字符不和当前wordIdenx相同 都直接剪枝 不往下递归了 并且在对当前位置进行四个方向递归的时候,需要将该位置标志数组置为true代表使用过了 在将四个方向递归完了,要把当前位置的标志位修改回来,回溯
class Solution { boolean res = false ; int r = 0 ; int c = 0 ; boolean [ ] [ ] usered = null ; public boolean exist ( char [ ] [ ] board, String word) { r = board. length; c = board[ 0 ] . length; usered = new boolean [ r] [ c] ; char [ ] chars = word. toCharArray ( ) ; for ( int i = 0 ; i < r ; i++ ) for ( int j = 0 ; j < c ; j++ ) { if ( board[ i] [ j] == chars[ 0 ] ) backtrack ( board, i, j, chars, 0 , usered) ; } return res; } public void backtrack ( char [ ] [ ] board, int i, int j, char [ ] chars, int wordIndex, boolean [ ] [ ] usered) { if ( res) return ; if ( wordIndex == chars. length) { res = true ; return ; } if ( i < 0 || j < 0 || i > r- 1 || j > c- 1 || usered[ i] [ j] || board[ i] [ j] != chars[ wordIndex] ) return ; usered[ i] [ j] = true ; backtrack ( board, i- 1 , j, chars, wordIndex+ 1 , usered) ; backtrack ( board, i+ 1 , j, chars, wordIndex+ 1 , usered) ; backtrack ( board, i, j- 1 , chars, wordIndex+ 1 , usered) ; backtrack ( board, i, j+ 1 , chars, wordIndex+ 1 , usered) ; usered[ i] [ j] = false ; } }