题目:单词搜索

来源:互联网 发布:全球域名注册局 编辑:程序博客网 时间:2024/05/17 04:33

给出一个二维的字母板和一个单词,寻找字母板网格中是否存在这个单词。


单词可以由按顺序的相邻单元的字母组成,其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。

您在真实的面试中是否遇到过这个题?

Yes





样例

给出board =

[

  "ABCE",

  "SFCS",

  "ADEE"

]

word = "ABCCED", ->返回 true,

word = "SEE",-> 返回 true,

word = "ABCB", -> 返回 false.
标签 Expand   

解题思路:
递归回溯,用一个visited记录走过的路,不能走成功就回溯。
用一个direct2维数组表示其4个方位可访问的位置
public class Solution {    /**     * @param board: A list of lists of character     * @param word: A string     * @return: A boolean     */    public boolean exist(char[][] board, String word) {        // write your code here         if(null==board||0==board.length){              return false;         }         boolean visited[][] = new boolean[board.length][board[0].length];         for (int i = 0; i < board.length; i++) {               for(int j=0;j<board[0].length;j++){                    if(board[i][j]==word.charAt(0)){                        visited[i][j] = true;                         if(word.length()==1||search(i, j, board, word.substring(1), visited)){                                                           return true;                         }                        visited[i][j] = false;                    }               }          }         return false;    }       public boolean search(int i,int j,char[][] board,String word,boolean[][] visited){         if(word.length()==0){              return true;         }         int[][] direct = new int[][]{{-1,0},{1,0},{0,-1},{0,1}};         for(int k=0;k<direct.length;k++){              int ii = i+direct[k][0];              int jj = j+direct[k][1];              if(ii>=0&&ii<board.length&&jj>=0&&jj<board[i].length&&!visited[ii][jj]&&word.charAt(0)==board[ii][jj]){                   visited[ii][jj] = true;                   if(word.length()==1||search(ii, jj, board, word.substring(1), visited)){                        return true;                   }                  visited[ii][jj] = false;              }         }         return false;    }}

0 0
原创粉丝点击