题目
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
示例 2:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”
输出:true
示例 3:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”
输出:false
代码(DFS)
public class Solution
{
private int[] m_MoveX = new int[]{-1, 0, 1, 0};
private int[] m_MoveY = new int[]{0, 1, 0, -1};
public bool Exist(char[][] board, string word)
{
bool[][] passArray = new bool[board.Length][];
for (int i = 0; i < board.Length; i++)
passArray[i] = new bool[board[i].Length];
for (int i = 0; i < board.Length; i++)
for (int j = 0; j < board[i].Length; j++)
{
passArray[i][j] = true;
if (Dfs(i, j, board, word, 0, passArray)) return true;
passArray[i][j] = false;
}
return false;
}
private bool Dfs(int x, int y, char[][] board, string word, int index, bool[][] passArray)
{
if (index >= word.Length) return true;
if (word[index] != board[x][y]) return false;
if (index == word.Length - 1) return true;
for (int i = 0; i < 4; i++)
{
int fx = x + m_MoveX[i], fy = y + m_MoveY[i];
if (fx < 0 || fy < 0 || fx >= board.Length ||
fy >= board[x].Length || passArray[fx][fy]) continue;
passArray[fx][fy] = true;
if (Dfs(fx, fy, board, word, index + 1, passArray)) return true;
passArray[fx][fy] = false;
}
return false;
}
}