单词搜索-leetcode

题目描述

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

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

示例 1:

img

输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "ABCCED"
输出:true

示例 2:

img

输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "SEE"
输出:true

示例 3:

img

输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "ABCB"
输出:false

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • boardword 仅由大小写英文字母组成

解法一

思路:

回溯法,首先遍历一遍寻找所有可能的开头位置,用visited数组记录当前位置是否被访问过,在候选位置判断其在二维数组的上下左右的位置是否满足word[k]的字符,满足其接着判断下一个位置,过程中要进行恢复之前状态。

代码:

class Solution {
    private boolean flag = false;
    public boolean exist(char[][] board, String word) {
        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;
                    backTrack(board,word,1,visited,i,j);
                    visited[i][j] = false;
                }
            }
        }
        return flag;
    }

    public void backTrack(char[][] board, String word,int k,boolean[][] visited,int i,int j) {
        if(flag) return;
        if(k==word.length()){
            flag = true;
            return;
        }
        if(i-1>=0&&!visited[i-1][j]&&board[i-1][j]==word.charAt(k)){
            visited[i-1][j] = true;
            backTrack(board,word,k+1,visited,i-1,j);
            visited[i-1][j] = false;
        }
        if(i+1<board.length&&!visited[i+1][j]&&board[i+1][j]==word.charAt(k)){
            visited[i+1][j] = true;
            backTrack(board,word,k+1,visited,i+1,j);
            visited[i+1][j] = false;
        }
        if(j-1>=0&&!visited[i][j-1]&&board[i][j-1]==word.charAt(k)){
            visited[i][j-1] = true;
            backTrack(board,word,k+1,visited,i,j-1);
            visited[i][j-1] = false;
        }
        if(j+1<board[0].length&&!visited[i][j+1]&&board[i][j+1]==word.charAt(k)){
            visited[i][j+1] = true;
            backTrack(board,word,k+1,visited,i,j+1);
            visited[i][j+1] = false;
        }

    }
}
posted @ 2026-03-28 21:07  狐狸胡兔  阅读(3)  评论(0)    收藏  举报