image.png

解题思路

深度优先搜索 回溯

  1. class Solution {
  2. //用来标识四个方向
  3. private int[][] d = {{-1,0},{0,1},{1,0},{0,-1}};
  4. private int m,n; //m n 标识平面的尺寸
  5. private boolean[][] visited; //标识每个元素是否被访问过
  6. //判断下标是否越界
  7. private boolean inArea(int x,int y){
  8. return x>=0&&x<m&&y>=0&&y<n;
  9. }
  10. //从board[startx][starty]开始,寻找word[index....word.size()]
  11. private boolean searchWord(char[][] board,String word,int index,int startx,int starty){
  12. //如果找到了最后一个字符 则判断最后一个字符是否匹配
  13. if(index==word.length()-1)
  14. return board[startx][starty] == word.charAt(index);
  15. //首先判断当前元素是否与单词对应的元素匹配
  16. if(board[startx][starty] == word.charAt(index)){
  17. //设定该元素已经访问过
  18. visited[startx][starty]=true;
  19. //向四个方向出发去寻找
  20. for(int i=0;i<4;i++){
  21. //设定新的元素的下标
  22. int newx = startx + d[i][0];
  23. int newy = starty + d[i][1];
  24. //首先判断新的下标是否越界 然后确保之前没有访问过
  25. if(inArea(newx,newy)&&!visited[newx][newy]){
  26. //递归地进行seach 此时单词下标+1 使用的是新的坐标
  27. //如果寻找成功 返回true
  28. if(searchWord(board,word,index+1,newx,newy)){
  29. return true;
  30. }
  31. }
  32. }
  33. //如果四个方向上都没有找到 则回溯 标识该元素没有被访问过
  34. visited[startx][starty]=false;
  35. }
  36. //不匹配直接返回false
  37. return false;
  38. }
  39. public boolean exist(char[][] board, String word) {
  40. //声明平面的大小
  41. m = board.length;
  42. n = board[0].length;
  43. //初始化访问数组
  44. visited = new boolean[m][n];
  45. //遍历数组 尝试从平面的每一个元素来寻找word
  46. for(int i=0;i<board.length;i++){
  47. for(int j=0;j<board[i].length;j++)
  48. //首先从下标为0的单词元素开始寻找
  49. if(searchWord(board,word,0,i,j))
  50. return true;
  51. }
  52. //如果下面遍历完之后都没有找到 则返回false
  53. return false;
  54. }
  55. }