leetcode 79 单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

这道题是典型的深度优先遍历DFS的应用,原二维数组就像是一个迷宫,可以上下左右四个方向行走,我们以二维数组中每一个数都作为起点和给定字符串做匹配,我们还需要一个和原数组等大小的visited数组,是bool型的,用来记录当前位置是否已经被访问过,因为题目要求一个cell只能被访问一次。如果二维数组board的当前字符和目标字符串word对应的字符相等,则对其上下左右四个邻字符分别调用DFS的递归函数,只要有一个返回true,那么就表示可以找到对应的字符串,否则就不能找到。还可以不用visited数组,直接对board数组进行修改,将其遍历过的位置改为井号,记得递归调用完后需要恢复之前的状态。

 public boolean exist(char[][] board, String word) {
    if(word == null || word.length() == 0) return true;
    char[] chs = word.toCharArray();
    int m = board.length;
    int n = board[0].length;
    for(int i = 0; i < m; i++){
        for(int j = 0; i < n; j++){
            if(dfs(board, chs, 0, i, j)){
                return true;
            }
        }
    }
    return false;
}
public boolean dfs(char[][] board, char[] chs, int index, int x, int y){
    if(index == word.length) return true;
    if(x < 0 || x == board.length; || y < 0 || y == board.length){
        return false;
    }
    if(board[x][y] != word[index]) return false;
    char visited= board[x][y];
    board[x][y] = "\0";
    boolean exist = dfs(board, word, index + 1, x, y + 1)
                  || dfs(board, word, index + 1, x, y - 1)
                  || dfs(board, word, index + 1, x - 1, y)
                  || dfs(board, word, index + 1, x + 1, y);
    board[x][y] = visited;
    return exist;
}

参考:http://www.cnblogs.com/grandyang/p/4332313.html

猜你喜欢

转载自blog.csdn.net/qq_43322057/article/details/84556797