LeetCode 79 – 单词搜索

题目描述

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

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

题目分析

DFS,每层对应单词中的一个下标,使用visited数组标记哪个位置访问过

Java

private int[][] directions = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
private boolean exist = false;

public boolean exist(char[][] board, String word) {
    int m = board.length;
    int n = board[0].length;
    for (int i = 0; i < board.length; i++) {
        for (int j = 0; j < board[i].length; j++) {
            dfs(board, new boolean[m][n], i, j, word, 0);
            if (exist) {
                return true;
            }
        }
    }
    return false;
}

private void dfs(char[][] board, boolean[][] visited, int i, int j, String word, int index) {
    int m = board.length;
    int n = board[0].length;
    if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j] || board[i][j] != word.charAt(index) || exist) {
        return;
    }
    if (index == word.length() - 1) {
        exist = true;
        return;
    }
    visited[i][j] = true;
    for (int[] dir : directions) {
        int newI = i + dir[0];
        int newJ = j + dir[1];
        dfs(board, visited, newI, newJ, word, index + 1);
    }
    visited[i][j] = false;
}

Kotlin

private val directions = arrayOf(intArrayOf(1, 0), intArrayOf(-1, 0), intArrayOf(0, 1), intArrayOf(0, -1))
private var exist = false

fun exist(board: Array<CharArray>, word: String): Boolean {
    for (i in board.indices) {
        for (j in board[0].indices) {
            dfs(board, word, i, j, 0, Array(board.size) { BooleanArray(board[0].size) })
            if (exist) {
                return true
            }
        }
    }
    return false
}

private fun dfs(board: Array<CharArray>, word: String, i: Int, j: Int, index: Int, visited: Array<BooleanArray>) {
    if (i !in board.indices || j !in board[0].indices || board[i][j] != word[index] || visited[i][j] || exist) {
        return
    }
    if (index == word.length - 1) {
        exist = true
        return
    }
    visited[i][j] = true
    for (dir in directions) {
        dfs(board, word, i + dir[0], j + dir[1], index + 1, visited)
    }
    visited[i][j] = false
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部